Как получить доступ к подпискам от данного издателя? (комбинированный комплект) - PullRequest
0 голосов
/ 16 июня 2020

Есть ли способ получить подписки, обратившись к издателю?

В приведенном ниже примере я создал издателя, на него подписались два подписчика и издатель отправил значение.

Здесь, в этом простом сценарии, все работы объединяются в пару строк кода. Легко заметить, кто подписался на издателя. Однако в реальном приложении каждая работа разделена на части, и подписчикам трудно заметить его с точки зрения издателя.

Итак, есть ли у издателя свойства для получения доступа к подписчикам или подпискам? Или вы предлагаете шаблон проектирования, чтобы сделать поток данных между издателем и подписчиком более очевидным?

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)

1 Ответ

1 голос
/ 16 июня 2020

Нет, вы не можете запрашивать у издателя его существующих подписчиков или подписки.

Что касается шаблонов проектирования, я не уверен, какова ваша цель.

  • Если вы хотите иметь возможность находить подписчиков во время отладки, я бы сказал, что в этом отделе не хватает Combine. Возможно, Apple порадует нас лучшими инструментами отладки на WWD на следующей неделе C.

  • Если вы хотите иметь возможность статически видеть общий поток, я не думаю, что вам это нужно любые специальные выкройки. Вам необходимо применить те же навыки, которые вы использовали бы, чтобы написать ясную и понятную программу, не использующую Combine. Учтите, что другие, гораздо более старые API, такие как NotificationCenter, обеспечивают очень похожую развязку излучателей сигналов и приемников сигналов.

Имейте в виду, что Combine - это «просто» реализация Apple Rx ( Реактивные расширения) парадигма. Поскольку Apple так опоздала с игрой Rx (Microsoft выпустила Rx. NET 1.0 в 2011 году!), Существует множество советов о том, как использовать Rx, которые применимы к Combine.

...