RxSwift(二)原理-执行流程

RxSwift使用步骤:

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

示例代码

    let disposbag: DisposeBag = DisposeBag()
    // 创建序列
    let ob:Observable<Any> = Observable.create { (observer) -> Disposable in
        
        // 发送信号
        observer.onNext("text")
        observer.onCompleted()
        return Disposables.create()
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, 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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 探索RxSwift的核心逻辑,我们从RxSwift的使用流程入手,带着自己的疑问去寻找答案,将会事半功倍。 RxS...
    king_jensen阅读 2,972评论 2 1
  • 透视RxSwift核心逻辑 篇幅稍微有点长,了解程度不同,可以跳过某些部分。如果对源码比较熟悉的,建议直接看图就行...
    silasjs阅读 5,186评论 2 21
  • 发现 关注 消息 RxSwift入坑解读-你所需要知道的各种概念 沸沸腾关注 2016.11.27 19:11*字...
    枫叶1234阅读 7,860评论 0 2
  • RxSwift的核心流程可以简化为三个步骤: 创建序列 订阅序列 发送信号 在执行这行代码得到的结果是: 订阅到:...
    瀚_阅读 3,638评论 0 3
  • 前言 通过上一篇内容RxSwift学习--核心逻辑初探,对RxSwift有了些初步的认知,下面通过源码来看一下Rx...
    Henry_Jeannie阅读 3,101评论 0 3

友情链接更多精彩内容