【发布时间】:2020-12-21 01:54:40
【问题描述】:
我正在尝试编写一个发布者,当后续订阅者连接到它时,它会立即向该订阅者发出最后一个发出的值,然后继续向所有连接的订阅者发出未来的值。
问:有没有办法做到这一点无需从头开始编写发布者,而只需编写内置发布者?我可能在这里遗漏了一些东西。
所以,如果我们有一个出版商每秒计数:
let counter = Timer.publish(every: 1, on: .main, in: .common)
.autoconnect()
.scan(0, { v, _ in v + 1 })
let sharedPublisher = // ??? something with counter publisher above
sharedPublisher.sink { print("A: ", $0 }.store(in: &bag)
// after 2.5 seconds
sharedPublisher.sink { print("B: ", $0 }.store(in: &bag)
输出将是:
A: 1 // at t=1 sec
A: 2 // at t=2
B: 2 // at t=2.5
A: 3 // at t=3
B: 3 // at t=3
起初,我天真地以为我可以只使用.share 和.buffer:
let sharedPublisher = counter
.share()
.buffer(size: 1, prefetch: .byRequest, whenFull: .dropOldest)
但当然,这不起作用,因为buffer 仅在下游尚未准备好接受值时才缓冲,这里不是这种情况。
可能是Record/Record.Recording?
【问题讨论】:
-
向新订阅者提供其最新值的发布者是 CurrentValueSubject。
-
@matt,我认为
CurrentValueSubject总是在其初始化中给出最初提供的值。它实际上给出了最后一个发出的?编辑:你是对的!你能写一个关于如何连接它以获得上面的输出的答案吗?