RXSwift里面有一个重要的知识点就是序列,今天讲讲序列订阅的原理。下面会按照代码一步步执行,会有各个函数的截图,不过还是希望能自己在项目里面跟着跳转、查看。
首先了解一下序列订阅过程中用到的各种类的关系图
现在以下面为例,一步步代码进行解析(下面翻译的代码不可运行、只是方便理解):
直接跳转create方法进去,进到
这里我们发现没有具体实现,然后看注释里面有
于是我们去搜索这个文件,发现果然有实现
所以第一步:创建序列 相当于
let ob = AnonymousObservable()
ob._subscribeHandler = {(obserber : AnyObserver<E>)
obserber.onNext("订阅内容")
}
然后 ob.subscribe(onNext: { (text) in
print("订阅到:\(text)")
})
此时ob是AnonymousObservable对象,根据上面的类关系图,AnonymousObservable和其父类里面的subscribe的参数都是ObserverType类型的,只有ObservableType里面subscribe(event:Event<E>)满足,所以
此时self.asObservable()相当于ob.asObservable(),而AnonymousObservable的父类Observable里面有asObservable()的实现
,所以self.asObservable() = self
所以第二步:订阅信号 相当于
let observer = AnonymousObserver()
observer._eventHandler = { (event : Event<E>)
switch event {
case .next (let value):
onNext?(value)
}
}
ob.subscribe(observer)
observer是AnonymousObserver类型,根据关系图,AnonymousObserver遵循ObserverType协议,所以ob.subscribe(observer)可以假定成ob.subscribe(observer : ObserverType),根据关系图,会执行Producer.subscribe(observer : ObserverType)
这里面其余代码不用管,主要是self.run(observer),根据关系图,子类AnonymousObservable里面有实现run()方法,所以
所以AnonymousObservable.run(observer) 相当于
let sink = AnonymousObservableSink()
sink._observer = observer
sink.run(ob)
然后看AnonymousObservableSink的run方法
相当于ob._subscribeHandler(AnyObserver(self)),ob._subscribeHandler我们前面第一步创建序列时有写过,现在要看AnyObserver(self)是什么,首先要知道此时的self是AnonymousObservableSink对象,而AnonymousObservableSink遵循ObserverType协议,所以可以假定成AnyObserver(observer : ObserverType)
所以会执行上面红框内的init方法,假定这是一个anyObserver对象
所以anyObserver.observer = sink.on
此时代码执行到ob._subscribeHandler(anyObserver),再回头看第一步的创建序列
obserber.onNext("订阅内容") 即 anyObserver.onNext("订阅内容"),因为anyObserver也是遵循ObserverType协议
所以anyObserver.on(.next("订阅内容")),继续看AnyObserver的on方法
即anyObserver.observer(.next("订阅内容")) = sink.on(.next("订阅内容")),来到AnonymousObservableSink的on方法
来到父类Sink的forwardOn
前面有保存sink._observer = observer,所以这里就是observer.on(.next("订阅内容"))
AnonymousObserver没有实现on方法,但其父类ObserverBase有实现
来到子类AnonymousObserver的onCore方法
此时相当于observer._eventHandler(.next("订阅内容")),前面有保存过observer._eventHandler
observer._eventHandler = { (event : Event<E>)
switch event {
case .next (let value):
onNext?(value)
}
}
所以此时执行 onNext?("订阅内容") 也就是订阅信号时的onNext
至此,整个序列订阅信号流程基本就结束了。