快速结合使makeConnectable与PassthroughSubject

时间:2020-03-14 20:17:21

标签: swift combine

我很难在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()之后如何向下游向订阅者发送值。这些文档在这个主题上非常稀疏,我希望有人可以向我展示如何实现此行为。

2 个答案:

答案 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,订户将收到我们发送的任何内容。