RxSwift-PublishSubject
今天给大家介绍一下RxSwift中的几个PublishSubject
PublishSubject,在官方文档中是这样描述PublishSubject的:
PublishSubject emits to an observer only those items that are emitted by the source Observable(s) subsequent to the time of the subscription
说白了就是PublishSubject必须要在订阅之后,才能收到消息,这个消息也必须是在订阅之后发送的。上一下代码感受一下
PublishSubject分析一下上图的代码:
首先创建了一个PublishSubject:publishObj
接着publishObj这个Object发送了一条next事件0,
再接着publishObj订阅了自己同时返回了一个Disposable: firstObj
最后publishObj又发送了一条next事件1
那么打印结果会是啥呢,让我给你分析到来:
firstObj只会收到next(1),不会收到next(0),why?因为firstObj的订阅是在发送next(0)之后订阅的,firstObj是收不到之前发送的事件,next(1)是在firstObj订阅之后发送的,所以能收到next(1),打印结果送上:
那么firstObj中的其他print为什么没有执行呢,似乎只执行了onNext,这是因为你没有发送onError,onComplete事件,注意onError和onComplete这两个事件只会执行一个,就是有你没我!当执行完onError或者onComplete事件以后就会自动执行onDisposed事件,继续上一段代码
代码 执行结果这里如果把上图的publishObj.onCompleted()放到publishObj.onNext(1)之前会是什么结果呢,答案是onNext(1)这个事件就接收不到了,why?因为一旦有onComplete或者是onError事件,就会停止发送之后的所有事件了,
继续如果把publishObj.onCompleted()放到onNext(0)之前呢,那么结果就是onNext事件肯定是接收不到了,直接进入onComplete事件,接着onDisposed事件
总结就是: PublishObject事件必须是在订阅之后,才能收到在订阅之后发送的消息,如果一旦有onError事件或者是onComplete事件,那么事件发送就会中断了,但是在这个之前发送的事件都会被接收到!来一幅官方的图感受一下:
PublishObject最后: 提醒一下就是一定要记得将firstObj放入DisposeBag中进行回收,代码是这样的:
let bag = DisposeBag()
firstObj.disposed(by: bag)