使用RxSwift观察Swift 3中的数组

时间:2017-06-29 18:44:03

标签: ios swift rx-swift reactivex

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

[1, 2, 3].toObservable().subscribeNext { print($0) }

但是在Swift 3中,它不再起作用,我收到了这个错误:

  

类型'[Int]'的值没有成员'toObservable'

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

2 个答案:

答案 0 :(得分:14)

不推荐使用toObservable array-to-Observable构造函数。

创建冷可观察

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

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

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

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

调用fromjust运算符时数组的元素将是onNext事件的最终排放集,并以onCompleted结尾事件。对数组的更改将不会被识别为此可观察序列的新事件。

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

但是如果我需要监听数组元素的更改呢?

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

感冒和热观察之间有什么区别?

RxSwiftreactivex.io的文档中解释了冷观察和热观察之间的区别。以下是与热观测值相比较的冷观测值的简短描述。

  

Cold Observables在订阅时开始运行,即,在调用Subscribe时,可观察序列仅开始向观察者推送值。 [...]这与热观察不同,例如鼠标移动事件或股票代码,即使在订阅激活之前,它们已经产生了价值。

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

答案 1 :(得分:9)

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

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对象而不是使用显式数组。