何时使用RACReplaySubject与RACMulticastConnection?

时间:2013-02-25 19:40:26

标签: objective-c reactive-programming reactive-cocoa

使用ReactiveCocoa,似乎有两种方法让订阅者从信号中接收相同的值,而不是重新触发生成这些值的任何操作:通过RACReplaySubject或RACMulticastConnection。

以下是RACReplaySubject的标题文档:

  

重播主题保存发送的值(达到其定义的容量)       并将这些重新发送给新订阅者。它还会重播错误或       完成。

对于RACMulticastConnection:

  

多播连接封装了共享一个订阅的想法    向许多订户发出信号。如果订阅,通常需要这样做    潜在的信号涉及副作用或不应被称为超过    一次。

     

多播信号仅在订阅时订阅    调用-[RACMulticastConnection connect]。在此之前,没有价值观    将在signal发送。请参阅-[RACMulticastConnection autoconnect]了解具体方法    -[RACMulticastConnection connect]可以自动调用。

     

请注意,您不应手动创建RACMulticastConnection。而是使用    -[RACSignal publish]-[RACSignal multicast:]

有人可以提供关于何时使用RACReplaySubject或RACMulticastConnection 的简单指南?

1 个答案:

答案 0 :(得分:33)

实际上,它们并不相互排斥,甚至可以一起使用。

RACMulticastConnection的主要目的是订阅基本信号,然后将订阅多播到任意数量的其他订阅者,而不会多次触发基本信号的副作用。< / p>

RACMulticastConnection通过向私有RACSubject发送值来实现此目的,该私有signal通过连接的-publish属性公开。订阅者附加到主题(不会产生任何副作用),并且连接会转发所有基本信号的事件。

创建连接有几种不同的方法:

  • -multicast:与普通RACSubject建立连接。此主题不会将以前的值重播给新订阅者。
  • -replay方法会根据您选择的主题创建连接。您可以决定在此使用RACReplaySubject
  • -replayLast-replayLazilyconnecting方法可以方便地与RACReplaySubject建立连接,然后自动{{3}}。< / LI>

如果有疑问,-replayLazily可能会执行您想要的操作,因为它会保存所有值,并且只在返回的信号收到订阅时触发任何副作用(或启动任何工作)。