概念
Observable 等同于 RAC 中的信号 RACSignal。它会发送 3 种事件:
- next
- completed
- error
事件 Event 是一种特殊的枚举,包含了上述 3 个值,其中 next 和 error 事件都会带一个参数,但 completed 事件没有参数:
public enum Event<Element> {
case next(Element)
case error(Swift.Error)
case completed
}
创建 Observable
创建 Observable 有许多方法,这些方法在 RxSwift 中叫做“操作符”——实际上 Observable 的所有方法都叫做“操作符”。
其实 Observable 就是“序列”,创建 Observable 就是创建序列(这是一般情况,会有例外)。所谓“序列”,即多个元素构成的集合,听起来有点像数组,但会不一样。
最简单的创建 Observable 的方式就是用数组来创建,这个数组中可能包含多个值,也可能只包含 1 个值。
just 操作符
let observable = Observable<Int>.just(1)
用数字 1 创建一个 Observable,很简单这个序列只有一个元素。它只会向订阅者发送一个元素就结束了。
of 操作符
let observable = Observable.of(1, 2, 3)
of 操作符的参数是一个可变参数,参数个数不定,你想传多少个都可以,这可以构成一个多个元素的序列。但是如果你直接传一个数组给它:
let observable = Observable.of([1, 2, 3])
这就不一样了,这表示这个序列中只有一个元素,这个元素是一个整型数组。
from 操作符
let observable = Observable.from([1, 2, 3])
这个等同于:
let observable = Observable.of(1, 2, 3)
这就没什么好说的了。
empty 操作符
let observable = Observable<Void>.empty()
这会创建一个空序列,也就是说这个序列中什么元素都没有。它唯一会发送的事件就是 .completed。
Observable 是泛型的,它的泛型参数要么是手动指定,要么是推断的。前面的 of 也好,from 也好,都可以通过参数的类型来推导出泛型参数,但 empty 必须你手动指定为 Void 了,因为它没有参数,自然无从推导。
never 操作符
let observable = Observable<Any>.never()
这个序列就牛 x 了,它即不发送 next 事件,也不会发送 completed 事件,相当于是一个无限循环了。
订阅
Observable 需要订阅后才能生效。也就是说,如果不订阅 Observable,什么事件都不会发生。
subscribe 方法
订阅调用的是 subscribe 方法:
let observable = Observable.of(1, 2, 3)
observable.subscribe { event in
print(event)
}
打印结果是:
next(1)
next(2)
next(3)
completed
如果只想打印值,而不是事件本身,改成这样既可:
observable.subscribe{ element in
if let element = event.element {
print(element)
}
}
或者:
observable.subscribe(onNext: { element in
print(element)
})
当然,既然有专门的 onNext 参数,自然就会有 onCompleted 和 onError 参数:
observable.subscribe(
onNext: { element in
print(element)
},
onCompleted: {
print("Completed")
}
onError: { print($0) }
)