响应式编程

  • 响应式编程(Reactive Programming,简称RP)
  1. 也是一种编程范式,于1997年提出,可以简化异步编程,提供更优雅的数据绑定 
  2. 一般与函数式融合在一起,所以也会叫做:函数响应式编程(Functional Reactive Programming,简称FRP)
  • 比较著名的、成熟的响应式框架
  • ReactiveCocoa
  1. 简称RAC,有Objective-C、Swift版本
  2. 官网: http://reactivecocoa.io/
  3. github:https://github.com/ReactiveCocoa
  • ReactiveX
  1. 简称Rx,有众多编程语言的版本,比如RxJava、RxKotlin、RxJS、RxCpp、RxPHP、RxGo、RxSwift等等 
  2. 官网: http://reactivex.io/
  3. github: https://github.com/ReactiveX

RxSwift

  • RxSwift(ReactiveX for Swift),ReactiveX的Swift版本
  1. 源码:https://github.com/ReactiveX/RxSwift
  2. 中文文档: https://beeth0ven.github.io/RxSwift-Chinese-Documentation/
  • RxSwift的github上已经有详细的安装教程,这里只演示CocoaPods方式的安装

swift 热更新方案 swift reaction_swift 热更新方案

  • RxSwift:Rx标准API的Swift实现,不包括任何iOS相关的内容 
  • RxCocoa:基于RxSwift,给iOS UI控件扩展了很多Rx特性

RxSwift的核心角色

  •  Observable:负责发送事件(Event)
  • Observer:负责订阅Observable,监听Observable发送的事件(Event)
  • 图解:

swift 热更新方案 swift reaction_RxSwift_02

 

  • Event有3种
  1. next:携带具体数据
  2. error:携带错误信息,表明Observable终止,不会再发出事件 
  3. completed:表明Observable终止

Event的底层代码:

swift 热更新方案 swift reaction_响应式编程_03

  • 调度者 Scheduler
  1. MainScheduler主线程,与UI相关的任务均在该线程下执行
  2. SerialDispatchQueueScheduler相当于GCD对应的串行队列
  3. ConcurrentDispatchQueueScheduler相当于GCD并行队列
  4. OperationQueueScheduler相当于NSOperationQueue管理者可以设置并发数
  5. CurrentThreadScheduler-当前线程
  • 销毁者 Dispose

创建、订阅Observable(一)

 Observable创建:

swift 热更新方案 swift reaction_github_04

Observable使用subscribe订阅:

swift 热更新方案 swift reaction_swift 热更新方案_05


Disposable

  • 每当Observable被订阅时,都会返回一个Disposable实例,当调用Disposable的dispose,就相当于取消订阅 
  • 在不需要再接收事件时,建议取消订阅,释放资源。有3种常见方式取消订阅

swift 热更新方案 swift reaction_github_06

 

 


创建、订阅Observable(二)

定时器创建Observable:

swift 热更新方案 swift reaction_RxSwift_07


创建Observer

swift 热更新方案 swift reaction_swift 热更新方案_08


扩展Binder属性

swift 热更新方案 swift reaction_Swift_09


传统的状态监听

  • 在开发中经常要对各种状态进行监听,传统的常见监听方案有
  1. KVO
  2. Target-Action (...addTarget...)
  3. Notification
  4. DelegatepBlock Callback
  • 传统方案经常会出现错综复杂的依赖关系、耦合性较高,还需要编写重复的非业务代码

RxSwift的状态监听

按钮点击的监听:

button.rx.controlEvent(.touchUpInside).subscribe(onNext: {
            print("按钮被点击了")
        }).disposed(by:bag)

下面的方法实现效果与上面的一致:

swift 热更新方案 swift reaction_RxSwift_10

属性监听:

swift 热更新方案 swift reaction_RxSwift_11


既是Observable,又是Observer

swift 热更新方案 swift reaction_swift 热更新方案_12

  • 诸如UISlider.rx.value、UTextField.rx.text这类属性值,既是Observable,又是Observer 
  • 它们是RxCocoa.ControlProperty类型

RxSwift的tableView的应用

swift 热更新方案 swift reaction_Swift_13

注意:如果设置了tableView的delegate,RxSwift所设置的上面的tableview的rx的方法都会失效。