如何做一个持续发布价值的Combine发布者?
How to make a Combine publisher that publish values continuously?
我需要一个发布者,它可以连续发布从 1 到 360 的值,值之间有一定的时间间隔。
我有这个发布者每秒发布一个从 1 到 360 的值,但是一旦达到 360 就停止,基本上 (1...360).publisher
停止提供值,但我需要发布者重新开始发布值来自 1
添加一个条件 if 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)
}
}
}
这里不需要 3 个发布器(计时器、数字生成器、压缩的),一个管道就足够了:
let delayedValuesPublisher = Timer
.publish(every: 1, on: .main, in: .default)
.autoconnect()
.scan(0, { val, _ in val % 360 + 1 })
scan
在集合上的工作方式类似于 reduce
,通过根据累积值和发布者产生的值的转换生成下一个元素(我们忽略它,因为我们不关心计时器产生的Date
)。
我需要一个发布者,它可以连续发布从 1 到 360 的值,值之间有一定的时间间隔。
我有这个发布者每秒发布一个从 1 到 360 的值,但是一旦达到 360 就停止,基本上 (1...360).publisher
停止提供值,但我需要发布者重新开始发布值来自 1
添加一个条件 if 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)
}
}
}
这里不需要 3 个发布器(计时器、数字生成器、压缩的),一个管道就足够了:
let delayedValuesPublisher = Timer
.publish(every: 1, on: .main, in: .default)
.autoconnect()
.scan(0, { val, _ in val % 360 + 1 })
scan
在集合上的工作方式类似于 reduce
,通过根据累积值和发布者产生的值的转换生成下一个元素(我们忽略它,因为我们不关心计时器产生的Date
)。