RxSwift(二)原理-执行流程

RxSwift使用步骤:

  1. 创建序列
  2. 订阅信号
  3. 发送信号

示例代码

    let disposbag: DisposeBag = DisposeBag()
    // 创建序列
    let ob:Observable = Observable.create { (observer) -> Disposable in
        
        // 发送信号
        observer.onNext("text")
        observer.onCompleted()
        return Disposables.create()
    }
    
    override func touchesBegan(_ touches: Set, with event: UIEvent?) {
        
        // 订阅信号
        ob.subscribe(onNext: { (text) in
            print(text)
        }, onCompleted:{
            print("订阅完成")
        }).disposed(by: disposbag)
    }

执行结果

text
订阅完成

关注点:

  1. 创建序列做了什么
  2. 订阅信号做了什么
  3. 如何将发送信号

接下来进入RxSwift源码世界一探究竟!

创建序列

首先点击create方法进入源码实现

create

很遗憾,只有声明,没有实现······
没事,看注释。在项目里搜索create文件。

create

AnonymousObservable(subscribe)

综上:create方法创建并返回了一个AnonymousObservable对象,我们暂且称之为序列对象A序列对象A保存了create方法传入的闭包。

订阅信号

点击subscribe方法,进入源码。
上面的序列对象A遵循了ObservableType$协议,所以进入第二个方法查看。

subscribe


可以看出subscribe方法中创建了一个继承自AnonymousObserver类的观察者observer,我们暂且称它为观察者对象B观察者对象B保存了EventHandler闭包,监听了传入的onNext,onError,onComplete,onDisposed四个闭包。

我们来看看这句代码

self.asObservable().subscribe(observer),

self其实就是序列对象A,在AnonymousObservable中并没有找到asObservable()实现,通过继承链,AnonymousObservable ->Producer-> Observable,在父类Observable中找到了实现,其实没做什么,只是返回了自己。

asObservable()

继续下一步:AnonymousObservable .subscribe(observer)。通过继承,AnonymousObservable ->Producer,在父类Producer中找到了subscribe方法,
subscribe(observer)


rxAbstractMethod()是个抽象方法,不在父类上实现,回到AnonymousObservable类:

AnonymousObservableSink(observer: observer, cancel: cancel)


保存observer,即保存了onNext,onError,onComplete,onDisposed四个闭包。

sink.run(self)

调用run,其中parentAnonymousObservable的别名,就是创建序列的时候的AnonymousObservableAnyObserver(self)AnyObserver(AnonymousObservableSink)self.observer = observer.on,即:self.observer = AnonymousObservableSink.on,这就将观察者对象B序列对象A的on事件关联起来了。

发送信号

observer.onNext("text"):
这里的observer其实就是观察者对象B

要执行观察者对象Bon事件,就得回到之前创建时保存的事件闭包,于是走到了AnonymousObservableSink.on




观察者对象B继承自类ObserverBase


rxAbstractMethod()是个抽象方法,不在父类上实现,回到AnonymousObserver类:



最后,在Disposables中销毁,RxSwift的调用逻辑结束。

RxSwift核心逻辑.png

初次接触,如有问题或者建议,欢迎大家评论或者私信。

你可能感兴趣的:(RxSwift(二)原理-执行流程)