如何访问给定发布者的订阅? (组合套件)

How to access the subscriptions from the given publisher? (combine kit)

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

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

在这个简单的场景中,所有作品都集中在几行代码中。很容易注意到谁订阅了发布者。然而,在现实世界的应用中,每件作品都是分割的,很难从出版商的角度注意到订阅者。

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

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)

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

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

  • 如果你想在调试时能够找到订阅者,那么我会说该部门缺少 Combine。也许 Apple 会在下周的 WWDC 上为我们带来更好的调试工具。

  • 如果你想静态的看到整体的流程,那我觉得你不需要什么特别的模式。您需要应用与编写不使用 Combine 的清晰易懂的程序相同的技能。考虑其他更古老的 API,如 NotificationCenter 提供非常相似的信号发射器和信号接收器解耦。

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