9

Jeśli używam RACable tak:Jak uzyskać "starą wartość" z sygnału ReactiveCocoa?

[RACAbleWithStart(self.myProp) subscribeNext:^(id x) { 
    // Do stuff 

}]; 

Jak mogę uzyskać dostęp do starej wartości myProp (przed zmianą spowodował sygnał na ogień)? Mogę więc dostęp do niego tak:

[RACAbleWithStart(self.myProp) subscribeNext:^(id x) { 
    // Do stuff 
    id newValue = x; 
    id oldValue = RAC_oldValue; 
}]; 
+0

Dlaczego nie wystarczy użyć KVO? Wzorce reaktywne radzą sobie ze zmianami w x, a nie x. 'RACAbleWithStart()' nie robi tego, co myśli: tworzy nowy sygnał, ale zapełnia go wartością początkową x, zamiast czekać na zmianę. Nic nie pamięta i nie ma na celu pokazywania widoków stanu zmiennego "przed i po". – CodaFi

+0

@CodaFi Nie oczekuję, że RACAbleWithStart poda mi starą wartość. Wiem, że to powoduje natychmiastowe wywołanie subskrybenta. Zadaję to pytanie, aby sprawdzić, czy istnieje sposób na dostęp do starej wartości, ponieważ ReactiveCocoa zostało zaprojektowane jako łatwiejsze w użyciu opakowanie wokół KVO. – zakdances

+2

Tak, jest to owinięcie wokół KVO, ale jak już powiedziałem, reaktywne wzorce nie zajmują się dawnymi wartościami, zajmują się zmianami i nowymi wartościami. Jeśli potrzebujesz czegoś blisko zapisania starej wartości, uruchom swoją relację RACAbleWithStart() za pomocą RACReplaySubject (nie jest to doskonałe, ale zadziała). – CodaFi

Odpowiedz

4

Użyłem tego fragmentu z sukcesem:

[[object rac_valuesAndChangesForKeyPath:@"property" options:NSKeyValueObservingOptionOld observer:self] subscribeNext:^(RACTuple *tuple) { 
    id newObject = tuple.first; 
    NSDictionary *change = tuple.second; 
    id oldObject = change[NSKeyValueChangeOldKey]; 
}]; 

Źródło: ReactiveCocoa documentation