美文网首页
RxSwift-PublishSubject

RxSwift-PublishSubject

作者: bekin | 来源:发表于2018-07-19 16:58 被阅读0次

今天给大家介绍一下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)

相关文章

  • RxSwift-PublishSubject

    今天给大家介绍一下RxSwift中的几个PublishSubject PublishSubject,在官方文档中是...

网友评论

      本文标题:RxSwift-PublishSubject

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