ReactiveCocoa:如何在服务器连接之前保持信号?

时间:2014-10-24 10:08:33

标签: ios reactive-cocoa

我有两个信号(RACSignal):

  1. synchronizeToServerSignal:包含要​​发送到服务器的数据的信号。
  2. serverConnectionSignal:包含布尔值的信号,用于指示连接状态。
  3. 更改内容时会触发synchronizeToServerSignal,此信号由serverConnectionSignal控制:

    • 如果serverConnectionSignal的最新值为YES,则synchronizeToServerSignal会继续发送下一个值(data)。
    • 如果serverConnectionSignal的最新值为NO,则synchronizeToServerSignal会保留最新值并丢弃旧值。 serverConnectionSignal发送YES后,serverConnectionSignal将继续发送下一个值。

    如何使用 ReactiveCocoa 来实现这一目标?

1 个答案:

答案 0 :(得分:2)

replayLast将为您提供一个信号,该信号保持发送的最新值并丢弃旧值。然后if:then:else:允许您根据第三个布尔信号的值在两个信号之间切换。

但是要切换什么?由于您只想忽略值,因此可以使用[RACSignal empty] - 从而在具有有用值的信号和具有 no 值的信号之间切换:

[RACSignal if:serverConnectionSignal
         then:[synchronizeToServerSignal replayLast]
         else:[RACSignal empty]] subscribeNext:^(id x) {
   // sync here
}];

此类代码的 intent 将通过类别中的辅助方法更加清晰:

@implementation RACSignal (Helpers)

- (RACSignal *)guard:(RACSignal *)boolSignal {
    return [RACSignal if:boolSignal then:self else:[RACSignal empty]];
}

@end

然后你可以写:

[[synchronizeToServerSignal replayLast] guard:serverConnectionSignal]

更明确!