RXSwift之Observable序列原理(2)

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

至此,整个序列订阅信号流程基本就结束了。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值