RxSwift的学习

函数式编程:
它使我们可以通过组合不同的方法,以及不同的函数来获取目标结果。

RxSwfit概念:
  • 1.函数响应式编程
  • 2.数据绑定

通过以下代码让NSObject的子类都具备了响应式的能力

/// Extend NSObject with `rx` proxy.
extension NSObject: ReactiveCompatible { }
在TableView中的使用

pod “RxDataSources”:包含了一些使用RxSwfit的类,比如RxTableViewSectionedReloadDataSource

用获取到的数据绑定tableView.

bind(to: tableView.rx.items(dataSource: dataSource))

modelSelected()点击之后的操作,传入model的类型
通过这样的方法也可以

.itemSelected
.map { indexPath in
    return (indexPath, dataSource[indexPath])
}
RxSwift的常用架构

MVVM:数据处理的逻辑可以单独进行测试。
保持结构清晰

使用如下代码让base类具备函数式编程的能力

extension Reactive where Base: UILabel {}
可监听序列

Observable 可以用于描述元素异步产生的序列。

框架已经帮我们创建好了许多常用的序列。例如:button的点击,textField的当前文本,switch的开关状态,slider的当前数值

创建序列最直接的方法就是调用 Observable.create
最后,用 observer.onCompleted() 表示元素已经全部产生

Single 只可以发出一个元素,要不就产生error事件
可以对 Observable 调用 .asSingle() 方法,将它转换为 Single。

Completable 只能产生一个 completed事件,要么就是error. 适用于那种你只关心任务是否完成,而不需要在意任务返回值的情况。它和 Observable 有点相似。

如果遇到那种可能需要发出一个元素,又可能不需要发出时,就可以使用 Maybe。

drive 方法只能被 Driver 调用。这意味着,如果你发现代码所存在 drive,那么这个序列不会产生错误事件并且一定在主线程监听。这样你可以安全的绑定 UI 元素。
asDriver 方法将 普通序列 转换为 Driver
Signal 和 Driver 相似,唯一的区别是,Driver 会对新观察者回放(重新发送)上一个元素,而 Signal 不会对新观察者回放上一个元素。
Signal 不会把上一次的点击事件回放给新观察者,而只会将订阅后产生的点击事件,发布给新观察者

一般情况下状态序列我们会选用 Driver 这个类型,事件序列我们会选用 Signal 这个类型。

ControlEvent 专门用于描述 UI 控件所产生的事件

如果一个序列共享附加作用,那在第二次订阅时,是否会重新发起网络请求,或者是共享第一次网络请求(附加作用)。

共享附加作用:

  • Driver
  • Signal
  • ControlEvent

不共享附加作用:

  • Single
  • Completable
  • Maybe
观察者

观察者 是用来监听事件,然后它需要这个事件做出响应。例如:弹出提示框就是观察者,它对点击按钮这个事件做出响应。

创建观察者最直接的方法就是在 Observable 的 subscribe 方法后面描述,事件发生时,需要如何做出响应。而观察者就是由后面的 onNext,onError,onCompleted的这些闭包构建出来的。

tap.subscribe(onNext: { [weak self] in
    self?.showAlert()
}, onError: { error in
    print("发生错误: \(error.localizedDescription)")
}, onCompleted: {
    print("任务完成")
})

Binder 可以只处理 next 事件,并且保证响应 next 事件的代码一定会在给定 Scheduler 上执行,这里采用默认的 MainScheduler。

由于页面是否隐藏是一个常用的观察者,所以应该让所有的 UIView 都提供这种观察者:

extension Reactive where Base: UIView {
  public var isHidden: Binder<Bool> {
      return Binder(self.base) { view, hidden in
          view.isHidden = hidden
      }
  }
}

也可以用这种方式来创建自定义的 UI 观察者。

框架里面定义了一些辅助类型,它们既是可监听序列也是观察者

可被清除的资源

disposed(by: disposeBag)是将绑定的生命周期交给 disposeBag 来管理,当 disposeBag 被释放的时候,那么里面尚未清除的绑定也就被清除了

posted @ 2021-06-30 11:02  书院柯浩然  阅读(273)  评论(0编辑  收藏  举报