2013-02-25 37 views
15

使用ReactiveCocoa,似乎有兩種方式讓訂戶從信號接收相同的值,而不是重新觸發任何生成這些值的操作:通過RACReplaySubject或RACMulticastConnection。何時使用RACReplaySubject與RACMulticastConnection?

下面是頭文檔爲RACReplaySubject:

重播主題保存它被髮送的值(直到其限定容量) 並重新發送那些新用戶。它也會重播一個錯誤或者 完成。

而對於RACMulticastConnection:

組播連接的封裝共享一個訂製了 信號到許多用戶的想法。如果訂購 底層信號涉及副作用或者不應該被調用超過 一次,這通常是需要的。

只有在調用 -[RACMulticastConnection connect]時纔會訂閱多播信號。在此之前,將不會發送到signal。請參閱-[RACMulticastConnection autoconnect]瞭解如何自動調用 -[RACMulticastConnection connect]

請注意,您不應手動創建RACMulticastConnection。請使用 -[RACSignal publish]-[RACSignal multicast:]

有人可以提供簡單指引,當你將使用RACReplaySubject或RACMulticastConnection

回答

32

其實它們並不相互排斥,甚至可以一起使用。

RACMulticastConnection的主要目的是訂閱一個基本信號,然後多播該訂閱到任何數量的其他用戶,而無需多次觸發基本信號的副作用。

RACMulticastConnection通過將值發送給專用RACSubject來完成此操作,該專用通過連接的signal屬性公開。用戶附加到主題(不會導致任何副作用),並且連接將所有基本信號的事件轉發到那裏。

有幾種不同的方法來創建連接:

  • -publish創建了一個簡單的RACSubject的連接。這個主題不會重播以前的值給新的用戶。
  • -multicast:方法創建與您選擇的主題的連接。您可以在這裏決定使用RACReplaySubject
  • -replay,-replayLast-replayLazily方法與創建與RACReplaySubject的連接的方便性,然後自動地connecting

如有疑問,-replayLazily可能會做你想要什麼,因爲它節省了所有的值,只有觸發任何副作用(或啓動任何工作)時,返回的信號接收訂閱。

+0

非常好,謝謝! – Poulsbo 2013-03-21 19:32:51

+0

RACMulticastConnection適用於WebSocket客戶端的「onMessage」塊嗎?那麼,用戶可以適當地過濾不同的數據類型會怎麼做? – 2014-11-09 10:45:14

+0

@MaxAlexander你可能想爲此打開一個單獨的問題,因爲我不認爲我可以在沒有更多細節的情況下回答它。 – 2014-11-10 18:39:42