要在Swift 2中使用RxSwift
创建一个可观察数组,我会这样做:
[1, 2, 3].toObservable().subscribeNext { print($0) }
但是在Swift 3中,它不再起作用,我收到了这个错误:
类型'[Int]'的值没有成员'toObservable'
如何从swift数组创建RxSwift
可观察数组?
答案 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])
调用
from
或just
运算符时数组的元素将是onNext
事件的最终排放集,并以onCompleted
结尾事件。对数组的更改将不会被识别为此可观察序列的新事件。
这意味着如果您不需要监听该数组的更改,可以使用just
和from
运算符来创建可观察数据。
要观察数组[E]
的更改,您需要使用hot observable之类的Variable
RxSwift单位,如k8mil的答案中所述。您将拥有类型为Variable<[E]>
的实例,其中每个onNext
发射都是数组的当前状态。
RxSwift和reactivex.io的文档中解释了冷观察和热观察之间的区别。以下是与热观测值相比较的冷观测值的简短描述。
Cold Observables在订阅时开始运行,即,在调用Subscribe时,可观察序列仅开始向观察者推送值。 [...]这与热观察不同,例如鼠标移动事件或股票代码,即使在订阅激活之前,它们已经产生了价值。
from
和just
运算符在代码运行时获取数组的当前状态,从而最终确定它将为其可观察序列触发的排放集,无论它何时订阅。这就是为什么稍后更改数组中的元素集不会更改使用from
或just
运算符创建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
对象而不是使用显式数组。