概念

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) }
)