使用 RxSwift 观察数组 Swift 3

Observe array in Swift 3 using RxSwift

要在 Swift 2 中使用 RxSwift 创建一个可观察数组,我曾经这样做:

[1, 2, 3].toObservable().subscribeNext { print([=11=]) }

但是在 Swift 3 中,它不再工作了,我得到了这个错误:

Value of type '[Int]' has no member 'toObservable'

如何从 swift 数组创建 RxSwift 可观察数组?

在 Swift 3 中使用 RxSwift 3.0 我会这样做:

var array: Variable<[Int]> = Variable([1, 2, 3])
array.asObservable().subscribe(onNext: {
        updatedArray in
        print(updatedArray)
})
array.value.append(4) // it will trigger `onNext` event 

所以主要区别在于您必须创建一个 Variable 对象而不是使用显式数组。

toObservable array-to-Observable 构造函数已弃用。

创建冷可观察对象

改为使用 from 运算符来创建冷可观察对象:

let stream : Observable<Int> = Observable.from([1,2,3])

或者如果您需要整个数组作为条目,请使用 just 运算符创建一个冷可观察对象。

let singleEmissionStream : Observable<[Int]> = Observable.just([1,2,3])

Elements of the array at the time that the from or just operator is called will be final set of emissions on the onNext events and will end with an onCompleted event. Changes to the array will not be recognized as new events for this observable sequence.

这意味着如果您不需要监听该数组的变化,您可以使用 justfrom 运算符来创建可观察对象。

但是如果我需要监听数组元素的变化怎么办?

要观察数组 [E] 的变化,您需要使用 hot observable 类似 Variable RxSwift 单元,如 k8mil 的答案中所述。您将拥有一个 Variable<[E]> 类型的实例,其中每个 onNext 发射都是数组的当前状态。

冷和热 Observable 之间有什么区别?

RxSwift and in reactivex.io 的文档中解释了冷和热 observable 之间的区别。以下是与热可观察对象相比的冷可观察对象的简短描述。

Cold observables start running upon subscription, i.e., the observable sequence only starts pushing values to the observers when Subscribe is called. [...] This is different from hot observables such as mouse move events or stock tickers which are already producing values even before a subscription is active.

fromjust 运算符在代码运行时获取数组的当前状态,从而最终确定它将为其可观察序列触发的发射集,无论何时订阅了。这就是为什么稍后更改数组中的元素集不会更改在使用 fromjust 运算符创建可观察对象期间识别为发射的元素集。