我有两个信号(RACSignal
):
synchronizeToServerSignal
:包含要发送到服务器的数据的信号。serverConnectionSignal
:包含布尔值的信号,用于指示连接状态。更改内容时会触发synchronizeToServerSignal
,此信号由serverConnectionSignal
控制:
serverConnectionSignal
的最新值为YES
,则synchronizeToServerSignal
会继续发送下一个值(data
)。serverConnectionSignal
的最新值为NO
,则synchronizeToServerSignal
会保留最新值并丢弃旧值。 serverConnectionSignal
发送YES
后,serverConnectionSignal
将继续发送下一个值。如何使用 ReactiveCocoa 来实现这一目标?
答案 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]
更明确!