为了账号安全,请及时绑定邮箱和手机立即绑定

RxSwift系列—RxSwift核心逻辑

标签:
iOS Swift

二、RxSwift核心逻辑

2.1 RxSwift使用三步曲

第一步:创建序列

let ob = Observable<String>.create { (observer) -> Disposable in
    return Disposables.create()
}

第二步:订阅信号

let _ = ob.subscribe(onNext: { (text) in
    print("订阅信息: \(text)")
}, onError: { (error) in
    print("error: \(error)")
}, onCompleted: {
    print("订阅结束")
}) {
    print("已销毁")
}

第三步:发送信号

let ob = Observable<String>.create { (observer) -> Disposable in
    // 第三步:发送信号
		obserber.onNext("你好明天")
    return Disposables.create()
}

代码合并:

// 第一步: 创建序列
_ = Observable<String>.create { (obserber) -> Disposable in
    // 第三步: 发送信号
    obserber.onNext("你好明天")
    return Disposables.create()  // 这个销毁不影响我们这次的解读
    // 第二步: 订阅序列
    }.subscribe(onNext: { (text) in
        print("订阅到:\(text)")
    })

2.2 三步曲源码分析

分析代码:

  • 1:创建序列的代码 Create 后面的 闭包A 里面有 第三步:发送信号,如果要执行 发送信号 ,必然要来到这个闭包A
  • 2:我们执行 第二步: 订阅序列 创建了 闭包B
  • 3:通过结果我们显然知道,先执行 闭包A你好明天 传给了 闭包B
  • 猜测:代码里面嵌套了闭包的执行调用!猜测的真实性,我们开始解读源码来验证

2.2.1 第一步:创建序列

使用Observable的create方法创建可观察序列
在这里插入图片描述
在这里插入图片描述
家可以很清晰看到我们的 可观察序列 的创建是利用协议拓展功能的create方法实现的,里面创建了一个 AnonymousObservable(匿名可观察序列) 命名还是体现了作者的思维 :这个类就是一个内部类,具备一些通用特性(具有自己功能的类才会命名) 下面我贴出这个类的继承关系:在这里插入图片描述
从上面的图,我们可以清晰的看到的继承关系。这地方我们主要需要掌握一下几个方法:

  • create 方法,其返回值为AnonymousObservable(subscribe)。一个内部匿名可观察序列类。参数subscribe则为第一步创建序列中的闭包。
  • AnonymousObservable 保存了外界的闭包
    在这里插入图片描述
  • AnonymousObservable继承了 Producer 具有非常重要的方法 subscribe

实现很简单,init初始化时保存了传入的闭包,至此,第一步创建序列完成

2.2.2 第二步:订阅信号

使用ObservableType的subscribe订阅信号
在这里插入图片描述
创建了一个 AnonymousObserver (匿名内部观察者) 手法和我们的 AnonymousObservable 差不多,它这里的初始化是闭包参数,保存了外界的 onNext, onError , onCompleted , onDisposed 的处理回调闭包的调用,函数结束时return一个Disposables对象,下面我还是给大家贴出 观察者 的继承链关系,帮助大家理解:
在这里插入图片描述
分析到现在,我们发现第一步的可观察序列有了,第二步的观察者也有了,但是他们之间似乎没有联系啊,怎么订阅的?以及第三步的发送信号又是如何执行的呢?

仔细查阅代码,我们就会发现,可观察序列观察序列 关系是通过如下代码进行联系的!
在这里插入图片描述
我们先看看asObservable(),点击查看一下,fuck!点不进去。我们再点查看一下subscribe(observer),咦,好像也找不到实现。再往前看是self,self我们知道是第一步创建的可观察序列 Observable
在这里插入图片描述
Observable ,我们找到了asObservable()subscribe 函数, asObservable()的作用仅仅是返回自身self。

我们再看看subscribe方法。 内部调用了rxAbstractMethod()方法。但是经过查看,这个方法内部并没有被实现。Why?

我们再回想一下,Observable对象是由create方法创建的。并且其内部是初始化了一个内部匿名可观察序列的实例对象。我们再回到Create文件查看一下源码。发现其也没有subscribe 函数。

通过观察AnonymousObservable的类继承图AnonymousObservable类是继承至Producer类,那subscribe函数会不会是其父类Producer的方法呢?

查看Producer源码:
在这里插入图片描述
在下方找到run函数。发现其内部只有一个rxAbstractMethod()函数调用。真正的run函数并没有实现。其实,这是一种设计模式。有好奇心的同学可以自行了解一下。这里就不展开叙述了。这个run函数其实刚才我们已将看到过了,Producer对象的子类AnonymousObservable匿名可观察序列类里
在这里插入图片描述

  • sink.run的写法也是比较好的,业务处理的还是下沉了,让分工更加明确
    在这里插入图片描述

  • parent 就是上面传过来的AnonymousObservable对象

  • 我们非常兴奋的看到 AnonymousObservable._subscribeHandler,从这句代码我们解惑了为什么我们的序列订阅的时候流程会执行我们 序列闭包,然后去执行 发送响应

  • 发送响应的代码等会分析,这里还有一个比较重要的家伙 AnyObserver(self)
    在这里插入图片描述
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YuPvW2Mk-1606821507376)(./typora-user-images/image-20200110201816206.png)]

  • 在这个构造方法里面,我们创建了一个结构体 AnyObserver 保存了一个信息 AnonymousObservableSink .on 函数,不是 AnonymousObservableSink,这个地方一般初次来到这里的人都会犯错误。不知道你是否意识到了!

兄弟们,重点来了,敲黑板!!!

在这个方法中,传入了之前创建的匿名观察者AnonymousObserver实例对象。并且创建了一个AnonymousObservableSink实例对象,并调用了它的run()函数。我们看一下这个run()函数的实现。其实是调用了parent._subscribeHandler(AnyObserver(self))parent就是AnonymousObservable的实例。也就是调用了AnonymousObservable._subscribeHandler(AnyObserver(self))

我们在分析第一步创建可观察序列的时候已经知道,这里的_subscribeHandler保存的其实就是第一步创建可观察序列传入的闭包。现在调用_subscribeHandler即是执行了这个闭包。而闭包中的方法就是第三步发送信号

经过上面的源码分析,已经知道了从创建可观察序列–>订阅信号–>发送信号这一系列的数据流转过程。

2.2.3 第三步:发送信号

我们从上面的分析,非常清晰:obserber.onNext(“你好明天”) 的本质是: AnyObserver.onNext(“你好明天”)

这时候发现我们的AnyObserver 是没有这个方法,这很正常!一般思路,找父类,找协议
在这里插入图片描述

  • 外界 obserber.onNext("你好明天") 再次变形 :AnyObserver.on(.next("你好明天")) ,这里大家一定要主要,这个AnyObserver调用了 on 里面传的是 .next函数, .next函数带有我们最终的参数
    在这里插入图片描述
  • self.observer构造初始化就是:AnonymousObservableSink .on 函数`
  • 看到这里又要变形咯:self.observer(event) -> AnonymousObservableSink .on(event) 其中 event = .next("明天你好") 最终我们的核心逻辑又回到了 sink 这个神奇的管子,看到这里不禁拍案叫绝, RxSwift这个设计能力,还有谁~~~
    在这里插入图片描述
  • self.forwardOn(event) 这也是执行的核心代码,因为 AnonymousObservableSink 继承 Sink 这里还有封装,请看下面的代码

在这里插入图片描述

  • 其中 self._observer 就是我们初始化保存的 观察者:AnonymousObserver
  • 那么我们变形得出本质就是:AnonymousObserver.on(.next("明天你好")), 这里逻辑辗转回到了我们 订阅序列 时候创建的 AnonymousObserver 的参数闭包的调用!所有的一切感觉是这样的啰嗦,但又是这么的顺其自然。
    在这里插入图片描述- 判断 event 进而调用 onNext?(value) ,因为枚举的关联值(Swift很强大的功能)value = "你好明天", 接下来就是外界 onNext闭包的调用传参,那么这个时候源码解析到这里,我相信你已经完全掌握了RxSwift的核心逻辑
    在这里插入图片描述

2.3 总结:RxSwift的结构

  • 1:就是序列感念 满世界都是序列 - 编码统一 ,随时随地享用
  • 2:通过函数式思想吧一些列的需求操作下沉(把开发者不关心的东西封装) - 优化代码,节省逻辑
  • 3:RxSwift最典型的特色就是解决Swift这门静态语言的响应能力,利用随时间维度序列变化为轴线,用户订阅关心能随轴线一直保活,达到订阅一次,响应一直持续~
点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消