【问题标题】:Observe array in Swift 3 using RxSwift使用 RxSwift 在 Swift 3 中观察数组
【发布时间】:2017-12-03 14:30:33
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios swift rx-swift reactivex


    【解决方案1】:

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

    创建一个冷的 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 运算符来创建 observable。

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

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

    cold 和 hot observable 有什么区别?

    RxSwiftreactivex.io 的文档中解释了冷和热 observable 之间的区别。下面是冷可观察物与热可观察物的对比的简短描述。

    冷可观察对象在订阅时开始运行,即,可观察序列仅在调用订阅时才开始将值推送给观察者。 [...] 这与诸如鼠标移动事件或股票行情之类的热点观察不同,它们甚至在订阅激活之前就已经产生了价值。

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

    【讨论】:

    • 您确定您创建的流能够正常工作吗?我已经对其进行了测试,并且阵列上的更改不会触发任何事件。你能提供一些订阅代码吗?谢谢你可以看看我的代码:pastebin.com/phbNjmec
    • 嗨,我一定是误读了这个问题。我认为问题是如何从[E] 类型的Swift 数组中得出Observable&lt;E&gt;。它没有具体说明它是热可观测还是冷可观测。我会注意到我提出的方法是冷可观察的,并解释它与使用Variable 的热可观察实现的区别。
    【解决方案2】:

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

    【讨论】:

    • 如果要将updatedArray中的值复制到同一个文件中的另一个Array中怎么办?
    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    相关资源
    最近更新 更多