【问题标题】:How to access the subscriptions from the given publisher? (combine kit)如何访问给定发布者的订阅? (组合套件)
【发布时间】:2020-06-16 10:28:35
【问题描述】:

有没有办法通过访问发布者来获取订阅?

在下面的示例中,我创建了一个发布者,并让两个订阅者订阅它并让发布者发送一个值。

在这个简单的场景中,所有工作都在几行代码中组合在一起。很容易注意到谁订阅了发布者。然而,在现实世界的应用中,每件作品都被分割开来,从发布者的角度很难注意到订阅者。

那么,发布者是否具有访问订阅者或订阅的属性? 或者,您是否建议一种设计模式,让发布者-订阅者数据流更加明显?

final class IntSubscriber: Subscriber {

  typealias Input = Int
  typealias Failure = Never

  func receive(subscription: Subscription) {
      print("receive subscription")
    subscription.request(.max(3))
  }

  func receive(_ input: Int) -> Subscribers.Demand {
    print("Received value", input)
    return .none
  }

  func receive(completion: Subscribers.Completion<Never>) {
    print("Received completion", completion)
  }
}

let subject = PassthroughSubject<Int, Never>()
let subscriber1 = IntSubscriber()
let subscriber2 = IntSubscriber()
subject.subscribe(subscriber1)
subject.subscribe(subscriber2)

// send a value without knowing who might get the value?
subject.send(3)

【问题讨论】:

    标签: ios swift combine publisher subscriber


    【解决方案1】:

    不,您不能向发布者询问其现有订阅者或订阅。

    至于设计模式,我不确定你的目标是什么。

    • 如果您希望能够在调试时找到订阅者,那么我会说该部门缺少 Combine。也许 Apple 会在下周的 WWDC 上用更好的调试工具让我们高兴。

    • 如果您希望能够静态查看整体流程,那么我认为您不需要任何特殊模式。您需要应用与编写不使用 Combine 的清晰易懂的程序相同的技能。考虑一下其他更老的 API,例如 NotificationCenter,提供了非常相似的信号发射器和信号接收器解耦。

    请记住,Combine “只是”Apple 对 Rx(反应式扩展)范式的实现。由于 Apple 在 Rx 游戏方面太晚了(Microsoft 于 2011 年发布了 Rx.NET 1.0!),因此有很多关于如何使用适用于 Combine 的 Rx 的建议。

    【讨论】:

    • 是的,我只是附和那个;我对 OP 的代码注释的回复“发送一个值而不知道谁会得到这个值?”是“是的,正是,这就是重点。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    相关资源
    最近更新 更多