Subject

作者: 桔子听 | 来源:发表于2018-03-14 16:28 被阅读10次

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

    Subject类型

    • PublishSubject

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

    • BehaviorSubject

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

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

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

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

    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)
    

    相关文章

      网友评论

          本文标题:Subject

          本文链接:https://www.haomeiwen.com/subject/mfnfqftx.html