假设我有一个元素数组[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编程的初学者,所以实现我自己的运算符还很困难。
答案 0 :(得分: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
展平策略结合起来。
(另外,请注意,您可以使用带有序列的信号产生器初始化器)