16

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

以下是 RACReplaySubject 的标头文档:

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

对于 RACMulticastConnection:

多播连接封装了将一个订阅共享给多个订阅者的想法。如果对基础信号的订阅涉及副作用或不应多次调用,则通常需要这样做。

多播信号仅在 -[RACMulticastConnection connect]被调用时订阅。在此之前,不会在 上发送任何值signal。查看-[RACMulticastConnection autoconnect]如何 -[RACMulticastConnection connect]自动调用。

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

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

4

1 回答 1

33

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

的主要目的RACMulticastConnection是订阅一个基本信号,然后将该订阅多播给任意数量的其他订阅者,而不会多次触发基本信号的副作用。

RACMulticastConnection通过将值发送到 private 来实现这一点,该 privateRACSubject是通过连接的signal属性公开的。订阅者附加到主题(不会导致任何副作用),并且连接将所有基本信号的事件转发到那里。

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

  • -publish创建与普通的连接RACSubject。该主题不会将以前的值重播给新订阅者。
  • -multicast:方法创建与您选择的主题的连接。你可以决定在RACReplaySubject这里使用。
  • , -replay,-replayLast-replayLazily方法可以方便地创建与 a 的连接RACReplaySubject,然后自动连接到它。

如果有疑问,-replayLazily可能会做您想做的事,因为它会保存所有值并且仅在返回的信号收到订阅时触发任何副作用(或开始任何工作)。

于 2013-03-10T05:29:34.020 回答