服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Swift - RxSwift学习之Observable的新建、订阅及取消订阅

RxSwift学习之Observable的新建、订阅及取消订阅

2021-01-07 15:33BigNerdCoding Swift

这篇文章主要给大家介绍了关于RxSwift学习教程之Observable的相关资料,文中详细的给大家介绍了关于新建Observable、订阅Observable和取消订阅并消除内存泄漏等相关的内容,需要的朋友可以参考借鉴,下面来一起看看吧。

前言

我们在前一篇基础之上,本文将会介绍 RxSwift 中的 Observables 部分。

在 RxSwift 中 Observable 也被称为 Observable Sequence、Sequence、Stream。Observable 会以异步的方式不断的发射事件形成事件流,并且数据也会沿着事件流进行传播。下图是事件流的图像化表示:

RxSwift学习之Observable的新建、订阅及取消订阅

其中从左到右的箭头代表时间轴,而三个圆圈则构成了可观察序列。而整个过程会按照从左到右的顺序。另外,事件可能在可观察序列生命周期内的任意时刻被触发。

Observable 生命周期

上图中的三个圆圈其实就是 RxSwift 中的 next 事件。除了 next 之外,RxSwift 中还有 completed 和 error 事件,而这两者都意味事件流生命周期的总结。

completed 所表示的正常终结:

RxSwift学习之Observable的新建、订阅及取消订阅

error 所表示的异常终结:

RxSwift学习之Observable的新建、订阅及取消订阅

在源码中这三类事件的定义如下:

?
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
*/

而真正创建数组类型变量的方法是:

?
1
2
3
4
5
6
7
8
let observable3 = Observable.of([one, two, three])
observable3.subscribe(onNext: { element in
  print(element)
 })
 
/* 打印结果:
[1, 2, 3]
*/

上面只是几个常用的 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)
}
 
/* 打印结果:
0 1 2
*/

不过 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
*/

又或者,我们需要对不同事件区别处理:

?
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

延伸 · 阅读

精彩推荐
  • SwiftSwift中排序算法的简单取舍详解

    Swift中排序算法的简单取舍详解

    对于排序算法, 通常简单的, 为大家所熟知的有, 选择排序, 冒泡排序, 快速排序, 当然还有哈希, 桶排序之类的, 本文仅比较最为常见的选择, 冒泡和快排,文...

    Castie111012021-01-10
  • Swift浅谈在Swift中关于函数指针的实现

    浅谈在Swift中关于函数指针的实现

    这篇文章主要介绍了浅谈在Swift中关于函数指针的实现,是作者根据C语言的指针特性在Swifft中做出的一个实验,需要的朋友可以参考下...

    Swift教程网4372020-12-21
  • SwiftSwift 基本数据类型详解总结

    Swift 基本数据类型详解总结

    在我们使用任何程序语言编程时,需要使用各种数据类型来存储不同的信息。变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。在声明...

    Lucky_William4672021-12-26
  • Swift详解Swift 之clipped是什么如何用

    详解Swift 之clipped是什么如何用

    这篇文章主要介绍了详解Swift 之clipped是什么如何用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    iCloudEnd8532021-05-28
  • SwiftSwift网络请求库Alamofire使用详解

    Swift网络请求库Alamofire使用详解

    这篇文章主要为大家详细介绍了Swift网络请求库Alamofire的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    lv灬陈强56682021-01-06
  • Swiftswift相册相机的权限处理示例详解

    swift相册相机的权限处理示例详解

    在iOS7以后要打开手机摄像头或者相册的话都需要权限,在iOS9中更是更新了相册相关api的调用,那么下面这篇文章主要给大家介绍了关于swift相册相机权限处...

    hello老文12682021-01-08
  • Swift分析Swift性能高效的原因

    分析Swift性能高效的原因

    绝大多数公司选择Swift语言开发iOS应用,主要原因是因为Swift相比Objc有更快的运行效率,更加安全的类型检测,更多现代语言的特性提升开发效率;这一系...

    louis_wang9092021-01-16
  • SwiftSwift算法之栈和队列的实现方法示例

    Swift算法之栈和队列的实现方法示例

    Swift语言中没有内设的栈和队列,很多扩展库中使用Generic Type来实现栈或是队列。下面这篇文章就来给大家详细介绍了Swift算法之栈和队列的实现方法,需要...

    李峰峰10002021-01-05