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

2020-01-08 23:40:14于丽

上面只是几个常用的 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, two, 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()