使用RxSwift观察Swift 3中的数组

pab*_*ros 8 ios swift rx-swift reactivex

RxSwift在Swift 2中创建一个可观察的数组,我用它来做:

[1, 2, 3].toObservable().subscribeNext { print($0) }
Run Code Online (Sandbox Code Playgroud)

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

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

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

iwi*_*not 15

toObservable阵列到可观察的构造被弃用.

创造一个冷的可观察者

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

let stream : Observable<Int> = Observable.from([1,2,3])
Run Code Online (Sandbox Code Playgroud)

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

let singleEmissionStream : Observable<[Int]> = Observable.just([1,2,3])
Run Code Online (Sandbox Code Playgroud)

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

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

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

要观察数组上的更改[E],您需要使用像RxSwift单元这样的热观察,Variablek8mil的答案中所指定的.您将拥有一个类型实例,Variable<[E]>其中每个onNext发射都是阵列的当前状态.

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

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

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

fromjust当代码运行,从而最终确定该组的排放,将火其可观察到的序列,无论当它被订阅的运营商采取阵列的当前状态.这就是为什么稍后对数组中元素集的更改不会改变在使用fromor just运算符创建observable期间被识别为排放的元素集.


kam*_*soc 10

在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 
Run Code Online (Sandbox Code Playgroud)

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