Когда использовать RACReplaySubject против RACMulticastConnection?

Используя ReactiveCocoa, кажется, есть два способа заставить подписчиков получать одни и те же значения из сигнала, а не повторно - запуск любой операции, создающей эти значения: через RACReplaySubject или RACMulticastConnection.

Вот заголовочные документы для RACReplaySubject:

Субъект воспроизведения сохраняет отправленные им значения (в пределах определенной емкости) и повторно отправляет их новым подписчикам. Он также будет воспроизводить ошибку или завершение.

И для RACMulticastConnection:

Многоадресное соединение заключает в себе идею совместного использования одной подписки на сигнал для многих подписчиков. Это чаще всего необходимо, если подписка на базовый сигнал включает побочные эффекты или не должна вызываться более одного раза.

Многоадресный сигнал подписывается только при вызове -[RACMulticastConnection connect]. До тех пор, пока это не произойдет, никакие значения не будут отправлены на signal. См. -[RACMulticastConnection autoconnect], как -[RACMulticastConnection connect] может вызываться автоматически.

Обратите внимание, что не следует создавать RACMulticastConnection вручную. Вместо этого используйте -[RACSignal publish] или -[RACSignal multicast:].

Может ли кто-нибудь предоставить простые рекомендации относительно того, когда следует использовать RACReplaySubject или RACMulticastConnection?


person Poulsbo    schedule 25.02.2013    source источник


Ответы (1)


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

Основная цель RACMulticastConnection — подписаться на базовый сигнал, а затем выполнить многоадресную рассылку. эту подписку любому количеству других подписчиков, без многократного запуска побочных эффектов базового сигнала.

RACMulticastConnection выполняет это, отправляя значения в частный RACSubject, который доступен через signal соединения. Подписчики прикрепляются к субъекту (что не вызывает никаких побочных эффектов), и соединение перенаправляет туда все события базового сигнала.

Существует несколько различных способов создания соединения:

  • -publish создает соединение с обычным RACSubject. Эта тема не будет воспроизводить предыдущие значения для новых подписчиков.
  • Метод -multicast: создает соединение с субъектом твой выбор. Вы можете решить использовать RACReplaySubject здесь.
  • -replay, -replayLast и -replayLazily удобны для создания соединения с RACReplaySubject, а затем автоматически подключение к нему.

Если вы сомневаетесь, -replayLazily, вероятно, сделает то, что вы хотите, потому что он сохраняет все значения и запускает любые побочные эффекты (или запускает какую-либо работу) только тогда, когда возвращаемый сигнал получает подписку.

person Justin Spahr-Summers    schedule 10.03.2013
comment
Подойдет ли RACMulticastConnection для блока onMessage клиента WebSocket? Затем подписчики могут соответствующим образом фильтровать, что делать с разными типами данных? - person Max Alexander; 09.11.2014
comment
@MaxAlexander Возможно, вы захотите открыть для этого отдельный вопрос, так как я не думаю, что смогу ответить на него без более подробной информации. - person Justin Spahr-Summers; 10.11.2014
comment
@JustinSpahr-Summers, что бы вы порекомендовали использовать с сигналами AFNetworking rac_GET, rac_POST... внутри RACCommand? replayLazily или replayLast? - person Nik; 03.05.2015
comment
@JustinSpahr-Саммерс. В любом случае, мы можем смоделировать одного-единственного подписчика сразу. Я просто хочу смоделировать этот stackoverflow.com/questions/36026927/ - person Swift Hipster; 07.06.2016