RxSwift学习之Observable的新建、订阅及取消订阅
|
副标题[/!--empirenews.page--]
前言 我们在前一篇基础之上,本文将会介绍 RxSwift 中的 Observables 部分。 在 RxSwift 中 Observable 也被称为 Observable Sequence、Sequence、Stream。Observable 会以异步的方式不断的发射事件形成事件流,并且数据也会沿着事件流进行传播。下图是事件流的图像化表示:
其中从左到右的箭头代表时间轴,而三个圆圈则构成了可观察序列。而整个过程会按照从左到右的顺序。另外,事件可能在可观察序列生命周期内的任意时刻被触发。 Observable 生命周期 上图中的三个圆圈其实就是 RxSwift 中的 next 事件。除了 next 之外,RxSwift 中还有 completed 和 error 事件,而这两者都意味事件流生命周期的总结。 completed 所表示的正常终结:
error 所表示的异常终结:
在源码中这三类事件的定义如下:
/// 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 let one = 1 let two = 2 let three = 3 // 2 let observable: Observable<Int> = Observable<Int>.just(one) 作为类方法 just 所创建的 Observable 对象只会包含一个元素。但是大多数时候,Observable 对象在其生命周期内会包含多个元素,而创建方法也很简单: let observable2 = Observable.of(one,two,three) 可能上面的代码会给人一种误导,让人觉得 observable2 中的数据可能是一个数组类型。不过好在我们可以通过下面的代码进行检验:
observable2.subscribe(onNext: { element in
print(element)
})
/* 打印结果:
1
2
3
*/
而真正创建数组类型变量的方法是:
let observable3 = Observable.of([one,three])
observable3.subscribe(onNext: { element in
print(element)
})
/* 打印结果:
[1,2,3]
*/
上面只是几个常用的 Observable 创建方法,更多的内容可以去查文档和代码。 订阅 Observable 在日常 iOS 编程中,通知模式可以说是使用频率相当高的一个设计模式。我们通过 NotificationCenter 实现消息的广播和订阅。下面是一个典型的通知模式代码用于处理 UIKeyboardDidChangeFrame 消息:
let observer = NotificationCenter.default.addObserver(
forName: .UIKeyboardDidChangeFrame,object: nil,queue: nil ) { notification in
// 闭包
}
RxSwift 中的订阅操作也非常简单,只需要调用 subscribe 方法就行了。不过与 NotificationCenter 机制不同的是,RxSwift 中每一个订阅都是唯一的并没有一个类似 default 这样的全局单例对象。 更为重要的是,在没有订阅者的时候 Observable 对象不会发送通知。另外, Observable 对象实际上是一个序列,所以订阅操作有点类似于反复调用 Swift 标准库里中迭代器 Iterator 对象 next 函数:
let sequence = 0..<3
var iterator = sequence.makeIterator()
while let n = iterator.next() {
print(n)
}
/* 打印结果:
0 1 2
*/
不过 RxSwift 订阅操作明显比这个来的更直接,并且可以一次实现对 next、error、completed 事件的的处理。一个简单的订阅操作示例:
let one = 1
let two = 2
let three = 3
let observable = Observable.of(one,three)
observable.subscribe { event in
print(event)
}
上面代码的订阅操作非常简单:打印出 observable 声明周期内的所有事件。正常情形下,它的结果如下: next(1) next(2) next(3) completed 当然,有时候我们可能只是需要 observable 所发射的数据:
observable.subscribe { event in
if let element = event.element {
print(element)
}
}
/* 打印结果:
1
2
3
*/
又或者,我们需要对不同事件区别处理:
observable .subscribe(
onNext: { element in
print(element)
},onCompleted: {
print("Completed")
}
)
取消订阅并消除内存泄漏 Observable 对象只有在存在订阅的情形下才会进行数据发送操作,而且会在 error 或 completed 事件触发时结束其生命周期。但是,有时候我们可能需要手动取消订阅并提前终结 Observable 对象的生命。
let observable = Observable.of("A","B","C")
let subscription = observable.subscribe { event in
print(event)
}
上面代码非常简单这里就不再细诉了,这里我们直接来看取消订阅的操作。其实,取消订阅的操作非常之简单只需一行代码: subscription.dispose() (编辑:清远站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |





