二、RxSwift核心逻辑

2.1 RxSwift使用三步曲

第一步:创建序列

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

第二步:订阅信号

let _ = ob.subscribe(onNext: { (text) inprint("订阅信息: \(text)")
}, onError: { (error) inprint("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) inprint("订阅到:\(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这门静态语言的响应能力,利用随时间维度序列变化为轴线,用户订阅关心能随轴线一直保活,达到订阅一次,响应一直持续~

RxSwift系列—RxSwift核心逻辑相关推荐

  1. RXSwift进阶:RXSwift的底层核心逻辑解析

    基础用法介绍 在上一篇的RXSwift基础介绍篇,我们已经知道RXSwift的基础用法大致分成三步: 1. 创建可观察序列 2. 监听序列(订阅序列发出的信号) 3. 销毁序列 //创建可观察序列 l ...

  2. RxSwift系列—RxSwift调度者

    四.RxSwift调度者 4.1 案例引入 Schedulers 是RxSwift实现多线程的核心模块.它主要用于控制任务在哪个线程或队列运行. 咱们在平时的开发过程中,肯定都使用过网络请求,网络请求 ...

  3. RxSwift系列—RxSwift高阶函数

    3.1 组合操作符 3.1.1 startWith 在开始从可观察源发出元素之前,发出指定的元素序列 print("*****startWith*****") Observable ...

  4. RxSwift学习--核心逻辑再探

    前言 通过上一篇内容RxSwift学习--核心逻辑初探,对RxSwift有了些初步的认知,下面通过源码来看一下RxSwift到底有多骚 RxSwift核心逻辑再探 先把上篇中的例子代码搬过来: //第 ...

  5. 机器学习系列(1)_逻辑回归初步

    转载自: 机器学习系列(1)_逻辑回归初步 - 寒小阳 - 博客频道 - CSDN.NET http://blog.csdn.net/han_xiaoyang/article/details/4912 ...

  6. 公益数字化蓝图及核心逻辑

    导读: 人力资源管理是通过招聘.甄选.培训.报酬等管理形式,对组织内外相关人力资源进行有效运用,满足组织当前及未来发展的需要,保证组织目标实现与成员发展的最大化的一系列活动的总称. 从公益数字化的应用 ...

  7. 人工智能算法通俗讲解系列(二):逻辑回归

    2019独角兽企业重金招聘Python工程师标准>>> 今天,我们介绍的机器学习算法叫逻辑回归.它英语名称是Logistic Regression,简称LR. 跟之前一样,介绍这个算 ...

  8. 自定义ClassLoader实现java应用核心逻辑模块热部署

    http://waterdh.iteye.com/blog/520399 本文主要是根据classloader的特性,结合实际产品环境中遇到的问题,来探讨下JAVA应用中局部模块热部署的可行性. 我们 ...

  9. Kong APIGW — Admin API 核心逻辑对象

    目录 文章目录 目录 Kong Admin API 的核心逻辑对象 Service(服务) Route(路由) Upstream(上游) Target(目标) Consumer(消费者) Plugin ...

  10. bigdecimal不等于0怎么写_创业计划书不知道怎么写?掌握核心逻辑是关键

    最近由于互联网+大学生创新创业大赛项目辅导的缘故,参与了很多项目赛前资料的准备,其中一项就是需要提交Word版的创业计划书.然而,无一例外,参赛项目团队以及指导教师对于创业计划书怎么准备并不是特别清楚 ...

最新文章

  1. cpu渲染测试软件,CineBench渲染能力测试_CPUCPU评测-中关村在线
  2. 【早知云世】云计算在商务智能中的应用及竞争力
  3. python括号匹配算法_使用Python的栈实现括号匹配算法
  4. 帝国Cms7.5开发的博客资讯新闻类微信小程序
  5. Linux curl命令参数详解--转载
  6. 浅谈.Net版(C#)的CMP模式
  7. 【Python】玫瑰花绘制
  8. html5json转换为数组,将JSON数组转换为jQuery中的HTML表
  9. 并发容器——ConcurrentHashMap
  10. 自动驾驶高精地图-概述与分析
  11. 【数据结构】线性表之数组---C++语言描述
  12. -f shell 模糊匹配_shell模糊匹配与正则详解
  13. 【笔记】PMBOK背诵技巧总结
  14. 一看就停不下来的中国史
  15. ddos攻击网站原理,遭受ddos攻击该如何处理进行防御?
  16. Android 显示文字超过指定长度部分使用省略号表示
  17. 职场学做“功夫熊猫”
  18. perl对日志进行压缩备份小程序
  19. 川土微电子 | 如何隔离 RS-485 系统
  20. java象棋实验报告_中国象棋java程序设计实验报告.doc

热门文章

  1. Matlab 图片批量复制到word中
  2. in comment after two dashes (--) next character must be > not (position: START_TAG seen ...
  3. Java异常抛出及自定义异常
  4. GraphSage:Inductive Representation Learning on Large Graphs
  5. 事业单位考试计算机专业知识题库,计算机考试题库:计算机考试模拟练习题(201)...
  6. oneway的定义和使用
  7. 《弃子长安》第三章 月下魅影
  8. 【菜鸟进阶之路】P6367 [COCI2006-2007#6] PRASE - 洛谷
  9. MySQL数据库W版与L版转换_mysql博文总结
  10. 使用Dockerfile集成python3 docker基础镜像