如何做一个持续发布价值的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)。