RxSwift源码札记-5:Observable.publish()订阅流程

166 阅读1分钟
 // *** multicast : 将源可观察序列转换为可连接序列,并通过指定的主题广播其发射。        
print("*****multicast*****")        
let subject = PublishSubject<Any>()       
     subject.subscribe{print("00:\($0)")}            
    .disposed(by: disposeBag)        
let netOB = Observable<Any>.create { (observer) -> Disposable in                
        sleep(2)// 模拟网络延迟                
        print("我开始请求网络了")                
        observer.onNext("请求到的网络数据")                
        observer.onNext("请求到的本地")                
        observer.onCompleted()                
    return Disposables.create {                    
            print("销毁回调了")               
         }           
     }.publish()        
netOB.subscribe(onNext: { (anything) in                
    print("订阅1:",anything)            
}).disposed(by: disposeBag)           
 netOB.subscribe(onNext: { (anything) in                
    print("订阅2:",anything)            
}).disposed(by: disposeBag)                
_ = netOB.connect()

Observable.publish()会生成并返回ConnectableObservableAdapter对象,该对象存储了Observable和新建的:PublishSubject。

当ConnectableObservableAdapter被订阅时,生成AnonymousObserver存储订阅回调,并执行PublishSubject的subscribe(observer),PublishSubject会存储该observer。

当ConnectableObservableAdapter调用connect()方法时,生成Connection对象,其持有lazySubject;调用Observable的subscribe(Connection)方法。

Connection作为Observer,所有会来到Connection的on方法,而on方法中会调用Connection所持有的PublishSubject的on方法。PublishSubject就会遍历其存储的_observers的on方法。