时间:2021-05-02
前言
我们在前一篇基础之上,本文将会介绍 RxSwift 中的 Observables 部分。
在 RxSwift 中 Observable 也被称为 Observable Sequence、Sequence、Stream。Observable 会以异步的方式不断的发射事件形成事件流,并且数据也会沿着事件流进行传播。下图是事件流的图像化表示:
其中从左到右的箭头代表时间轴,而三个圆圈则构成了可观察序列。而整个过程会按照从左到右的顺序。另外,事件可能在可观察序列生命周期内的任意时刻被触发。
Observable 生命周期
上图中的三个圆圈其实就是 RxSwift 中的 next 事件。除了 next 之外,RxSwift 中还有 completed 和 error 事件,而这两者都意味事件流生命周期的总结。
completed 所表示的正常终结:
error 所表示的异常终结:
在源码中这三类事件的定义如下:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /// Represents a sequence event. /// /// Sequence grammar: /// **next\* (error | completed)** public enum Event<Element> { /// Next element is produced. case next(Element) /// Sequence terminated with an error. case error(Swift.Error) /// Sequence completed successfully. case completed }在代码中,我们可以清晰的看到 next 事件会携带一个实例进行传播,error 事件会携带一个 Error 实例,completed 则什么都不会携带。
新建 Observable
在所有 Observable 对象的创建方法中,最简单的就是 just :
? 1 2 3 4 5 6 7 // 1 let one = 1 let two = 2 let three = 3 // 2 let observable: Observable<Int> = Observable<Int>.just(one)作为类方法 just 所创建的 Observable 对象只会包含一个元素。但是大多数时候,Observable 对象在其生命周期内会包含多个元素,而创建方法也很简单:
? 1 let observable2 = Observable.of(one, two, three)可能上面的代码会给人一种误导,让人觉得 observable2 中的数据可能是一个数组类型。不过好在我们可以通过下面的代码进行检验:
? 1 2 3 4 5 6 7 8 9 observable2.subscribe(onNext: { element in print(element) })而真正创建数组类型变量的方法是:
? 1 2 3 4 5 6 7 8 let observable3 = Observable.of([one, two, three]) observable3.subscribe(onNext: { element in print(element) })上面只是几个常用的 Observable 创建方法,更多的内容可以去查文档和代码。
订阅 Observable
在日常 iOS 编程中,通知模式可以说是使用频率相当高的一个设计模式。我们通过 NotificationCenter 实现消息的广播和订阅。下面是一个典型的通知模式代码用于处理 UIKeyboardDidChangeFrame 消息:
? 1 2 3 4 5 6 let observer = NotificationCenter.default.addObserver( forName: .UIKeyboardDidChangeFrame, object: nil, queue: nil ) { notification in // 闭包 }RxSwift 中的订阅操作也非常简单,只需要调用 subscribe 方法就行了。不过与 NotificationCenter 机制不同的是,RxSwift 中每一个订阅都是唯一的并没有一个类似 default 这样的全局单例对象。
更为重要的是,在没有订阅者的时候 Observable 对象不会发送通知。另外, Observable 对象实际上是一个序列,所以订阅操作有点类似于反复调用 Swift 标准库里中迭代器 Iterator 对象 next 函数:
? 1 2 3 4 5 6 7 8 9 10 11 let sequence = 0..<3 var iterator = sequence.makeIterator() while let n = iterator.next() { print(n) }不过 RxSwift 订阅操作明显比这个来的更直接,并且可以一次实现对 next、error、completed 事件的的处理。一个简单的订阅操作示例:
? 1 2 3 4 5 6 7 8 9 let one = 1 let two = 2 let three = 3 let observable = Observable.of(one, two, three) observable.subscribe { event in print(event) }上面代码的订阅操作非常简单:打印出 observable 声明周期内的所有事件。正常情形下,它的结果如下:
? 1 2 3 4 next(1) next(2) next(3) completed当然,有时候我们可能只是需要 observable 所发射的数据:
? 1 2 3 4 5 6 7 8 9 10 11 observable.subscribe { event in if let element = event.element { print(element) } }又或者,我们需要对不同事件区别处理:
? 1 2 3 4 5 6 7 8 9 observable .subscribe( onNext: { element in print(element) }, onCompleted: { print("Completed") } )取消订阅并消除内存泄漏
Observable 对象只有在存在订阅的情形下才会进行数据发送操作,而且会在 error 或 completed 事件触发时结束其生命周期。但是,有时候我们可能需要手动取消订阅并提前终结 Observable 对象的生命。
? 1 2 3 4 5 let observable = Observable.of("A", "B", "C") let subscription = observable.subscribe { event in print(event) }上面代码非常简单这里就不再细诉了,这里我们直接来看取消订阅的操作。其实,取消订阅的操作非常之简单只需一行代码:
? 1 subscription.dispose()当然,手动对每一个订阅对象进行取消操作显然是一件枯燥的工作。所以 RxSwift 为大家提供了一个更为简单的方案。只需在订阅时调用 .addDisposableTo() 添加一个 DisposeBag 类型对象,我们就能在 DisposeBag 对象销毁时取消所有绑定订阅对象的取消动作。
? 1 2 3 4 5 6 7 let disposeBag = DisposeBag() Observable.of("A", "B", "C") .subscribe { 3 print($0) } .addDisposableTo(disposeBag)这里我们之所以需要进行 DisposeBag 对象绑定或者手动调用 dispose() 进行取消订阅操作,是因为如果不这么做的话 Observable 对象在生命周期完结时会存在内存泄漏的问题。
总结
本文只是简单的介绍了 Observables 一些常见基础内容。这里还有很多更深入的内容没有介绍,例如:empty 和 never 类型的订阅、使用 Create 实现自定义 Observable 以及 Error 类型的自定义实现。如果你有兴趣的话,我强烈建议你查阅官方文档和代码。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://bignerdcoding.com/archives/51.html
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Subjects介绍1.Subjects是订阅者,也是Observable订阅者:它能动态的接收新的值。Observable:当Subjects有了新值后会通过
爱奇艺如何取消订阅取消订阅教程。当你订阅的节目或者其它的视频不在更新或者看腻了想取消订阅又该怎么取消订阅呢?下面小编就带来爱奇艺取消订阅教程。软件名称:爱奇艺视
重新获得订阅分的方法是只能等新的订阅出来后通过订阅来获取积分,订阅取消后再次订阅。不论过多久都不会获得积分的。 学习强国,是由中宣部主管、以习近平新时代中国特
取消订阅强国号和学习平台的方法是: 1、打开学习强国app,然后点击个人主页图标; 2、进入“学习强国”页面后点击“订阅”; 3、进入“我的订阅”页面,可
以苹果订阅为例,苹果订阅里面没有取消订阅是因为用户的苹果手机并没有订阅相关的项目,那么订阅一栏中就不会有取消订阅的选项,只有用户订阅一些项目时才可以取消订阅。