2

我需要一个发布者连续发布从 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)
            }

    }

}
4

1 回答 1

4

您在这里不需要 3 个发布者(计时器、数字制作者、压缩的发布者),一个管道就足够了:

let delayedValuesPublisher = Timer
    .publish(every: 1, on: .main, in: .default)
    .autoconnect()
    .scan(0, { val, _ in val % 360 + 1 })

scan就像reduce在集合上一样,通过基于累积值和发布者生成的值的转换来生成下一个元素(我们忽略它,因为我们不关心Date计时器生成的值)。

于 2020-10-20T13:39:41.590 回答