我很难在Connectable
上使用PassthroughSubject
协议。我想做的是能够控制PassthroughSubject
何时开始向其订阅者发送事件。
let eventPublisher = PassthroughSubject<String, Never>().makeConnectable()
let subscriber = MySubscriber()
eventPublisher.subscribe(subscriber)
eventPublisher.send("Hello") // Does not compile, send not found in Publisher.MakeConnectable
let cancelable = eventPublisher.connect()
// expect MySubscriber to recieve "Hello"
我是Combine的新手,但是我不明白在成为可连接的发布者并调用connect()
之后如何向下游向订阅者发送值。这些文档在这个主题上非常稀疏,我希望有人可以向我展示如何实现此行为。
答案 0 :(得分:2)
您接近了,但误解了makeConnectable的功能。它不会“排队”数据并准备好在可用时发送,而是控制建立订阅的时间。
只要允许订阅(使用.connect()
),发布者就会“处于活动状态”,而订阅者将收到您发送的值。但是,在调用connect()
之前发送的所有内容实际上都会被丢弃,而不是排队。
也就是说,如果您在最后一行之后调用eventPublisher.send('after connect')
,订户将收到该消息。
答案 1 :(得分:0)
听起来您想要的是CurrentValueSubject,而不是PassthroughSubject。
let countPublisher = CurrentValueSubject<Int,Never>(0)
var storage = Set<AnyCancellable>()
func f() {
self.countPublisher.value = 1
self.countPublisher
.sink {print($0)} // 1
.store(in:&self.storage)
}
如您所见,我们可以在任何订阅者出现之前用存储的值对泵进行填充,当订阅者出现时,它会立即接收存储的值。然后,我们可以说.send
,订户将收到我们发送的任何内容。