使用 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.
这意味着如果您不需要监听该数组的变化,您可以使用 just
和 from
运算符来创建可观察对象。
但是如果我需要监听数组元素的变化怎么办?
要观察数组 [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.
from
和 just
运算符在代码运行时获取数组的当前状态,从而最终确定它将为其可观察序列触发的发射集,无论何时订阅了。这就是为什么稍后更改数组中的元素集不会更改在使用 from
或 just
运算符创建可观察对象期间识别为发射的元素集。
要在 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
orjust
operator is called will be final set of emissions on theonNext
events and will end with anonCompleted
event. Changes to the array will not be recognized as new events for this observable sequence.
这意味着如果您不需要监听该数组的变化,您可以使用 just
和 from
运算符来创建可观察对象。
但是如果我需要监听数组元素的变化怎么办?
要观察数组 [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.
from
和 just
运算符在代码运行时获取数组的当前状态,从而最终确定它将为其可观察序列触发的发射集,无论何时订阅了。这就是为什么稍后更改数组中的元素集不会更改在使用 from
或 just
运算符创建可观察对象期间识别为发射的元素集。