2013-11-22 6 views
8

Sto cercando di imparare ReactiveCocoa e sto scrivendo un semplice clone di Space Invaders, basato su un tutorial di Ray Wenderlich. Ultimamente durante lo sviluppo, ho affrontato un problema che non riesco a risolvere. Fondamentalmente Ho due segnali:Combina i segnali in ReactiveCocoa a uno nuovo che spara quando tutto cambia

  • un segnale rubinetto gesto
  • una sequenza temporizzata che spara ogni secondo

Quello che voglio raggiungere è quello di combinare questi segnali in uno nuovo, che si accende quando entrambi i segnali cambiano: è possibile? Ho visto il metodo combineLatest, ma il blocco viene eseguito ogni volta che cambiano i segnali.

mio voleva pseudocodice è:

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); 
}]; 

Probabilmente posso ottenere lo stesso risultato in altro modo o questo non è il comportamento previsto o ReactiveCocoa, ma a questo punto mi chiedo se io sono nel giusto reattivo traccia o no.

risposta

12

Invece di +combineLatest:reduce:, si desidera +zip:reduce:. Zip richiede che tutti i segnali cambino prima di ridurre e inviare un nuovo valore.

+0

Intelligente. Non ho trovato il file zip nella documentazione, solo scorcio nei file di intestazione, quindi non ho notato la sua proprietà. –

5

Dal momento che in realtà non si preoccupano i valori del timer, -sample: può fare quello che vuoi:

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

Questo inoltrerà l'ultimo valore da gestureSignal ogni volta updateEventSignal incendi.

+0

Dovrebbe essere perfetto, ma dopo aver toccato una volta, continua a campionare lo stesso valore, ogni secondo. C'è un modo per ripristinare il segnale originale? –

+0

Ah, no, l'operatore non è proprio pensato per quello. Sembra "+ zip:" è un'opzione migliore, quindi. –

1
[[[[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. 
     }]; 
Problemi correlati