【问题标题】:Swift Combine: Waiting until subscribed to generate valuesSwift Combine:等到订阅生成值
【发布时间】: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,然后完成,那么您不需要制作自定义发布者来执行此操作。如果您需要更好的帮助,请提出更现实的问题。

标签: swift combine


【解决方案1】:

作为这个的延续。我一直在尝试的更改之一是在本地声明主题,而不是将其作为类变量。我认为这解决了一些人提出的关于多个订阅者的问题。

public func receive<S>(subscriber: S) where S: Subscriber, S.Failure == Failure, S.Input == Output {
    let subject = PassthroughSubject<Int, Error>()
    defaultValueSubject.receive(subscriber: subscriber)
    startSending(to: subject)
}

func startSending(to subject: PassThroughSubject<Int>) {
    subject.send(1)
    subject.send(2)
    subject.send(3)
    subject.send(completion: .finished)
}

【讨论】:

  • 这是问题的答案还是评论/附录?
猜你喜欢
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
相关资源
最近更新 更多