2013-06-19 11 views

risposta

6

segnali hanno alcuna nozione di un valore "corrente". I valori vengono inviati, quindi scompaiono - sono molto effimeri (a meno che non si utilizzi un oggetto di riproduzione o altri trucchi).

Probabilmente vorrai abbonarti a quel segnale. Controlla il Framework Overview e il examples in the README per una spiegazione più approfondita.

+0

Grazie. Volevo solo essere sicuro. A volte c'è la tentazione di non convertire tutto nel mondo ReactvieCocoa. –

+1

Ma posso fare: RAC (self.number) = signal; e poi usare self.number in qualche posto. –

+1

@ LeszekŻarna Sì, questo aggiornerà 'self.number' con l'ultimo valore dal segnale, ma dipende ancora dal concetto di _subscription_ sotto. Capire come funzionano le iscrizioni renderà il resto del RAC molto più facile da raccogliere. –

2
  1. tuo "valore corrente dal segnale ReactiveCocoa" nel linguaggio di reattiva - è un iscrizione a questo segnale.

I -subscribe... metodi consentono di accedere ai valori attuali e futuri in un segnale:

[signal subscribeNext:^(id x) { 
     NSLog(@"Current value = %@", x); 
    }]; 
  1. Un altro modo: se si desidera utilizzare questo valore con un altro valore - utilizzare combineLatest:reduce: metodo in questo modo:

    RACSignal *calculationWithCurrentValueSignal = 
        [RACSignal combineLatest:@[signalWithCurrentValueThatNeeded, anotherSignal] 
            reduce:^id(NSNumber *myCurrentValue, NSNumber *valueFromAnotherSignal) { 
             //do your calculations with this values.. 
             return newValue; 
            }]; 
    
1

sono le risposte valide anche per la versione Swift?

Immagine un SignalPipe che osserva una modifica su una proprietà dell'oggetto. Quando si sottoscrive il segnale da diversi altri oggetti, ad esempio queue.queueCountSignal.observeNext({...}), il blocco di osservazione verrà eseguito la prossima volta che la proprietà cambia. C'è un modo per chiedere il valore corrente o attivare observNextBlock?

Non voglio usare un SignalProducer (che può essere avviato in modo esplicito) perché ciò significherebbe che ho bisogno di raccogliere i blocchi observeNext da ogni oggetto il segnale è necessario. Inoltre, non voglio creare diversi produttori di segnali per la stessa cosa - o è effettivamente voluto?

Ecco il codice di esempio per rendere più chiaro

import ReactiveCocoa 

class SwipingQueueWithSignals<T> : SwipingQueue<T> { 

    override var count: Int { 
     didSet(oldQueueCount) { 
      let newQueueCount = self.count 
      queueCountSignalObserver.sendNext(newQueueCount) 
    } 

    let queueCountSignal: Signal<Int, NoError> 
    private let queueCountSignalObserver: Observer<Int, NoError> 

    init() { 
     (self.queueCountSignal, self.queueCountSignalObserver) = Signal<Int, NoError>.pipe() 
     super.init() 
    } 
} 

// Something like this 
queue.queueCountSignal. 
    .observeNext { next in print(next) } 
    .lookupCurrentValueNow() 
Problemi correlati