我需要一个发布器,该发布器以介于值之间的一定时间间隔连续发布1到360个值。
我有这个发布者,它每秒发布一个从1到360的值,但是一旦达到360,它就会停止,基本上(1...360).publisher
会停止提供值,但是我需要发布者保持从1开始重新发布值
如果value == 360,然后重新设置发布者,可能会添加条件,但这可能效率不高,因为条件是为每个单个值设置的,是否有更好的解决方案?
struct ContentView: View {
let delayedValuesPublisher = Publishers.Zip((1...360).publisher,
Timer.publish(every: 1, on: .main, in: .default)
.autoconnect())
var body: some View {
Text("")
.onReceive(delayedValuesPublisher) { (output) in
print(output.0)
}
}
}
答案 0 :(得分:4)
这里您不需要3个发布者(计时器,数字生产者,压缩的发布者),一个管道就足够了:
let delayedValuesPublisher = Timer
.publish(every: 1, on: .main, in: .default)
.autoconnect()
.scan(0, { val, _ in val % 360 + 1 })
scan
在集合上的作用类似于reduce
,它基于累积值和发布者产生的值的转换生成下一个元素(我们忽略,因为我们不在乎计时器产生的Date
。