【问题标题】:ReactiveSwift emit elements from an array with a delay between elementsReactiveSwift 从数组中发出元素,元素之间有延迟
【发布时间】:2018-09-17 15:58:55
【问题描述】:

假设我有一个元素数组 [1, 2, 3]5 秒的延迟。

我想发出数组的每个元素,在当前发出的元素和下一个发出的元素之间有一个暂停。

例子:

输出:

[00:00] -- 1
[00:05] -- 2
[00:10] -- 3

我已尝试执行以下操作:

import ReactiveSwift

let startTime     = DispatchTime.now().uptimeNanoseconds
let arrayProperty = MutableProperty<[Int]>([1, 2, 3])
let arraySignal   = arrayProperty.signal
arraySignal
    .flatMap { $0 }
    .delay(2, on: QueueScheduler.main)
    .observeValues { element in
        let elapsed = DispatchTime.now().uptimeNanoseconds
        print("\((elapsed - startTime) / 1_000_000_000) -- \(element)")
    }

但它只会延迟第一个元素的发射并立即发射下一个元素。

我找不到合适的运算符组合来使用,也许它们在 ReactiveSwift 框架中丢失了,而且我是反应式编程的初学者,所以实现我自己的运算符太难了。

【问题讨论】:

    标签: swift reactive-programming reactive-cocoa reactive-swift


    【解决方案1】:

    我还没有机会尝试这段代码,但它应该是这样的:

    SignalProducer([1, 2, 3])
        .flatMap(.concat) { n in
            return SignalProducer(value: n).delay(2, on: QueueScheduler.main)
        }
        .startWithValues { element in
            let elapsed = DispatchTime.now().uptimeNanoseconds
            print("\((elapsed - startTime) / 1_000_000_000) -- \(element)")
        }
    

    关键是您使用flatMap 为您可以应用延迟的每个值创建一个新的信号生成器,并将它们与.concat 扁平化策略相结合。

    (另外,请注意您可以使用接收序列的信号生产者初始化程序)

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多