Combine signals in ReactiveCocoa to a new one that fires when all change

拜拜、爱过 提交于 2019-11-29 10:11:22

问题


I'm trying to learn ReactiveCocoa and I'm writing a simple Space Invaders clone, based on a Ray Wenderlich tutorial. Lately during the development, I faced an issue I can't resolve. Basically I've two signals:

  • a tap gesture signal
  • a timed sequence that fires every second

What I want to achieve is to combine these signals in a new one, that fires when both the signals change: is it possible? I saw the combineLatest method, but the block is execute whenever any signals change.

My wanted pseudocode is:

RACSignal *updateEventSignal = [RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]];
RACSignal *gestureSignal = [[UITapGestureRecognizer new] rac_gestureSignal];
[[RACSignal combineBoth:@[gestureSignal, updateEventSignal]
                   reduce:^id(id tap, id counter){
                       return tap;
                   }]
 subscribeNext:^(id x) {
     NSLog(@"Tapped [%@]", x);
 }];

Probably I can achieve the same result in other way or this is not the expected behaviour or ReactiveCocoa, but at this point I wonder if I'm in the right reactive track or not.


回答1:


Instead of +combineLatest:reduce:, you want +zip:reduce:. Zip requires that all the signals change before reducing and sending a new value.




回答2:


Since you don't actually care about the values from the timer, -sample: may do what you want:

[[gestureSignal
    sample:updateEventSignal]
    subscribeNext:^(id tap) {
        NSLog(@"Tapped [%@]", tap);
    }];

This will forward the latest value from gestureSignal whenever updateEventSignal fires.




回答3:


   [[[[RACSignal zip:@[RACObserve(self, minimum), RACObserve(self, maximum), 
RACObserve(self, average)]] skip:1] reduceEach:^id{
            return nil;
        }] subscribeNext:^(id x) {
            [self buildView]; //called once, while all three values were changed.
        }];


来源:https://stackoverflow.com/questions/20144752/combine-signals-in-reactivecocoa-to-a-new-one-that-fires-when-all-change

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!