ReactiveCocoa CombineLatest:和Zip:

时间:2014-03-21 13:16:09

标签: ios reactive-cocoa

我遇到与此帖Combine signals in ReactiveCocoa to a new one that fires when all change

相同的问题

所以我改为使用zip:奇怪的问题是第二个信号数据不是最新的。我在第二个信号的地图代码中写了一个日志,这是最新的。 E.g。

信号A,信号B

[self rac_liftSelector:@selector(doTask:) withSignals:[RACSignal zip:@[A, B]      
reduce^id(NSNumber* a, NSNumber* b){
   a// is updated to latest
   b// is the old value
}];

在信号B中,我把日志找到b值更新了。   如果我更改回CombineLatest:b已更新,但a为旧值且信号未触发。

1 个答案:

答案 0 :(得分:18)

+[RACSignal zip:]并不总能为您传递的每个信号提供最新值。它为您提供每个信号的 next 值。这意味着如果你有以下大理石图:

Signal A | -(a0)-------------(a1)-----x
         |
Signal B | ----(b0)-(b1)-(b2)----(b3)--->
         |
 zip:A,B | ----(a0,b0)-------(a1,b1)--x
         |
         +-------------------------------
              -- Time -->

发送(a0, b0)时,您的信号将发送b0,发送(a1, b1)后发送a1,然后Signal A将不再发送任何值}仅在两个值之后完成。

另一方面,只要 信号发送一个值(在所有信号发送到之后),

+[RACSignal combineLatest:reduce:]将始终为您传递给它的每个信号提供最新值至少一个值):

Signal A | -(a0)-----------------------(a1)-----x
         |
Signal B | ----(b0)----(b1)----(b2)------------(b3)---->
         |
cl/r:A,B | ----(a0,b0)-(a0,b1)-(a0,b2)-(a1,b2)-(a1,b3)->
         |
         +----------------------------------------------
              -- Time -->