RxSwift和监听一样使用起来有三步,创建,订阅,注销。
它的核心主要是创建和订阅,但是它的核心也是分为三步
1.创建 2.订阅 3.发布订阅
创建
这里使用创建了一个Observable.create方法创建。Observable 是一个支持Any泛型的类,我们直接先看Observable是什么。
点击进入之后发现Observable有四个方法,继承自,再init和deinit 是对应的,先来看看init的时候它做了什么
这两个方法的意思是引用计数的加减,这样手动的控制引用计数配合disposeBag来实现垃圾回收,和OC的@autoreleasepool 是不是有异曲同工之妙。
接下来我们再回到Observable中,看看它的其他两个方法。subscribe,asObservable 这两个方法也没有注释,jumpto跳转的地方又很多,不清楚他们是干嘛的,可是这里没有找到我们最开始看到的create方法,那我们先记录一下,回去看看我们的create方法做了什么。
这里很明显看到我们的create方法来自于一个ObservableType的扩展,再回想一下,我们的Observable是遵循于ObservableType这个协议的,所以Observable才有了create的这个方法。这个方法里只有一个AnonymousObservable匿名函数,那我们再看看这个匿名函数的实现做了什么。
这里可以看到,AnonymousObservable是一个继承自Producer的类,自身不能被重写或者重载,里面定义了一个返回值是Disposable的闭包,在init的时候,将create传入的的闭包保存了起来,再向下没有了。
创建 = AnonymousObservable 保存创建的闭包 ;
订阅
我们再向下走
我又在下面添加了一个订阅的方法和一个disposed的方法,disposed上面已经说过了。所以我们重点来看我们的subscribe方法。
在方法中可以看到其实也是创建了一个let observer = AnonymousObserver
这个协议定义了了一个observable的方法,observable是里面返回的也是自己。那确定了self.asObservable()返回的是调用方法的这个本体,是谁订阅的呢,是我们创建时候获得Observable,最终的是AnonymousObservable。AnonymousObservable它在上面,我们看到它是没有subscribe方法的,那找谁,找他爸爸Producer去,这个名字就很直观了,制作人。
这里就更直观了,Producer是继承自Observable类的一个类,Observable没有继承了,那说明一件事Observable是监听序列的基类。Producer实现了subscribe方法,而返回disposer之前调用了run方法,run?下面就有一个啊,怎么又是这个rxAbstractMethod,查看一下,就是一个警告的,不对啊,这时候self不应该是AnonymousObservable它嘛,快回去看看,AnonymousObservable调用了Producer的subscribe方法,再从subscribe方法返回到自己重写的run方法。
我们先来看run方法,使用sink的run方法将自己传递进去调用了自己的subscribeHandler,那就说明,他调用了保存的闭包。这里就串起来了,创建的时候,先把创建的闭包保存,订阅的时候这里调用保存的闭包。
发布订阅
再次回到我们梦开始的地方
这里看到我在创建的闭包中用闭包的参数调用了用onNext,onError,onCompleted方法,因为成功和失败肯定是对立面啊,开个玩笑,因为在订阅中,失败和成功是单独的闭包,所以这里不能同时调用到。在这里查看onNext方法可以看到
这是ObserverType协议和它自己的扩展,总共有4个方法 ,on?嗯,调用创建闭包在什么时候,还记得我们的run方法吗,AnonymousObservable传递进去到AnonymousObservableSink的run方法,然后闭包的参数是AnonymousObservableSink,所以来到我们AnonymousObservableSink中看看
就是调用创建闭包的这个类,final修饰,遵循ObserverType协议,完美!!!
还记得参数吗AnyObserver(self)
asObservable()返回了一个AnyObserver,AnyObserver(self)正是我们创建的时候保存闭包的参数,AnyObserver(self)的self不就是AnonymousObservableSink它嘛,而 AnyObserver是一个遵循于ObserverType的结构体。
AnyObserver的init方法将observer.on保存了起来。
这下子就串起来了,原来onNext的时候会调用AnonymousObservableSink的on方法,再回去看看
on方法中调用了self.forwardOn(event)
AnonymousObservableSink的init方法是 super.init。这会我们就找他爸爸去
没错就是Sink
这里可以看到sink用自身持有的observer调用了on方法,这里的self.observer正是我们订阅闭包的保存者AnonymousObserver。所以这里就是AnonymousObserver的闭包收到event事件去真正的实现。
这样就真相大白了AnonymousObservableSink通过Sink保存的订阅闭包和自身在创建闭包中调用方法,把事件从创建的on方法中传递到订阅闭包的on方法中。
总结
创建
1创建的时候创建了一个AnonymousObservable 保存 创建的闭包
订阅
1订阅的时候创建了一个AnonymousObserva保存订阅的闭包
2 通过AnonymousObservable它来调用Producer的subscribe方法
3 Producer的subscribe方法再回来调用AnonymousObservable的run方法
4 AnonymousObservable的run方法 再去调用AnonymousObservableSink的run方法
5 AnonymousObservableSink 把传递进来的AnonymousObserver的on方法保存起来
6 AnonymousObservable 将自己作为参数调用AnonymousObservableSink的run方法,使用一个AnyObserver(AnonymousObservableSink)作为创建时候闭包的参数,相当于AnonymousObservable.subscribeHandler(AnyObserver(AnonymousObservableSink)
发布订阅
1 AnonymousObservableSink的on方法调用Sink中的forwardOn方法
2 Sink的forwardOn 调用自身持有的AnonymousObserver 内部的on方法
这就是RxSwift中传递事件的一个机制,如有不对请指正。
扩展
AnonymousObservable类继承自Producer,Producer继承自Observable。Observable遵循于ObservableType协议,ObservableType又遵循于ObservableConvertibleType协议。
AnonymousObserver类继承自ObserverBase,ObserverBase遵循了Disposable和ObserverType两个协议。
而ObservableConvertibleType和ObserverType两个协议都定义了 associatedtype Element这个类关联,这也就是我们在onNext传递的类型。
由于Observable支持