【发布时间】:2021-09-07 14:22:35
【问题描述】:
我正在尝试编写一个生成一些值的自定义发布者。像这样的:
class MyPublisher: Publisher {
typealias Output = Int
typealias Failure = Never
private let subject = PassThroughSubject<Int, Never>()
func receive<S>(subscriber: S) where S: Subscriber, S.Failure == Failure, S.Input == Output {
subject.receive(subscriber: subscriber)
startSending()
}
func startSending() {
subject.send(1)
subject.send(2)
subject.send(3)
subject.send(completion: .finished)
}
}
我试图弄清楚如何在订阅附加后自动调用startSending(),但我不确定我是否做得对。
我刚刚阅读了有关 ConnectablePublisher 的信息,想知道这是否有帮助,但我不确定如何。
有没有人尝试过这样的事情?你是怎么做到的?
【问题讨论】:
-
我不知道确切的答案,我已经有一段时间没有使用它了,但我可以自信地说:WWDC 主题演讲是关于组合的一些最佳文档,尤其是概念性的东西像这样,关于出版商生命周期究竟是如何运作的。我建议你看看那些,它们非常棒!
-
您实际上并没有做自定义发布者的工作。见我的apeth.com/UnderstandingCombine/publishers/publisherscustom.html。
-
@matt 我们不能只使用 PassthroughSubject
subject并在函数 receive 中执行subject.receive(subscriber: subscriber)以使其成为一个完整的自定义发布者吗? -
这就是你想要做的。一旦收到订阅者,它将开始发送,订阅者将收到更新。但是,由于您也在发送完成,因此只有第一个订阅者会收到更新。
-
问题是我不知道你真正想做什么。如果目标真的是发布 1,然后是 2,然后是 3,然后完成,那么您不需要制作自定义发布者来执行此操作。如果您需要更好的帮助,请提出更现实的问题。