代码之家  ›  专栏  ›  技术社区  ›  Tylerian

ReactiveSwift从数组中发射元素,元素之间有延迟

  •  0
  • Tylerian  · 技术社区  · 6 年前

    [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框架中缺少它们,而且我是一个反应式编程的初学者,所以实现我自己的操作符太难了。

    1 回复  |  直到 6 年前
        1
  •  4
  •   jjoelson    6 年前

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

    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 扁平化策略。

    (另外,请注意,可以使用采用序列的信号发生器初始值设定项)