ReactiveSwift从数组中发出元素,并在元素之间延迟

问题描述 投票:0回答:1

假设我有一系列元素[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框架上缺失,而且我是Reactive编程的初学者,所以实现我自己的运算符太难了。

swift reactive-programming reactive-cocoa reactive-swift
1个回答
3
投票

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

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 flatten策略结合起来。

(另请注意,您可以使用采用序列的信号生成器初始化程序)

© www.soinside.com 2019 - 2024. All rights reserved.