Subject

2018-03-14  本文已影响10人  桔子听

subject即是被观察者也是观察者。

Subject类型

没有初始值,要先订阅,才会发送事件。

有一个初始值,对于新的订阅,会重发最近的一次事件,如果没有其他事件,会重发初始值的事件。

let subject = BehaviorSubject(value: "Initial value")

有一个初始的缓冲大小,有新的订阅,会重发缓冲起来的所有事件。

let subject = ReplaySubject<String>.create(bufferSize: 2)

BehaviorSubject的包装,保存当前的值作为state,有新的订阅,重发最近的一次事件,如果没有其他事件,会重发初始值的事件。

let variable = Variable("Initial value")
let disposeBag = DisposeBag()
variable.value = "New initial value"
variable.asObservable()
    .subscribe {
      print(label: "1)", event: $0)
    }
    .disposed(by: disposeBag)

Variable需要初始值,用asObservable转为Observable,用value直接取得当前值。

如果这里的value是数组,改变数组也会触发事件。和KVO监听属性不一样。

PublishSubject代替delegate回调

在需要回调的页面里定义PublishSubject,但不要直接暴露PublishSubject,提供一个获取PublishSubject的方法:

private let selectedPhotosSubject = PublishSubject<UIImage>()
var selectedPhotos: Observable<UIImage> {
  return selectedPhotosSubject.asObservable()
}

// 发事件
selectedPhotosSubject.onNext(image)

viewWillDisappear中发送onComplete(),避免内存泄漏。

在其他页面获取到selectedPhotosSubject,进行监听,获取回调值。

photosViewController.selectedPhotos
  .subscribe(onNext: { [weak self] newImage in
  }, onDisposed: {
    print("completed photo selection")
  })
  .disposed(by: bag)
上一篇 下一篇

猜你喜欢

热点阅读