如何使连续发布价值的合并发布者?

时间:2020-10-20 09:55:54

标签: swift swiftui combine publisher

我需要一个发布器,该发布器以介于值之间的一定时间间隔连续发布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)
            }

    }

}

1 个答案:

答案 0 :(得分:4)

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

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

scan在集合上的作用类似于reduce,它基于累积值和发布者产生的值的转换生成下一个元素(我们忽略,因为我们不在乎计时器产生的Date