9

Nếu tôi đang sử dụng RACable như thế này:Làm cách nào để nhận được "giá trị cũ" từ tín hiệu ReactiveCocoa?

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

}]; 

Làm thế nào tôi có thể có thể truy cập các giá trị cũ của myProp (trước khi thay đổi gây ra các tín hiệu để bắn)? Vì vậy, tôi có thể truy cập vào nó như thế này:

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

Tại sao không chỉ cần sử dụng KVO? Các mẫu phản ứng đối phó với các thay đổi trong x, chứ không phải x. 'RACAbleWithStart()' không làm những gì bạn nghĩ nó làm: Nó tạo ra một tín hiệu mới, nhưng populates nó với giá trị ban đầu của x, thay vì chờ đợi một sự thay đổi để bắn. Nó không nhớ bất cứ điều gì, và nó không có nghĩa là để cung cấp cho bạn "trước và sau" quan điểm của nhà nước biến. – CodaFi

+0

@CodaFi Tôi không mong đợi RACAbleWithStart mang lại cho tôi giá trị cũ. Tôi biết nó chỉ làm cho các thuê bao cháy ngay lập tức. Tôi hỏi câu hỏi này để kiểm tra xem có cách nào để truy cập vào giá trị cũ không, vì ReactiveCocoa được thiết kế dễ sử dụng hơn bao quanh KVO. – zakdances

+2

Vâng, nó là một trình bao bọc xung quanh KVO, nhưng như tôi đã nói, các mẫu phản ứng không đối phó với các giá trị cũ, chúng xử lý các thay đổi và các giá trị mới. Nếu bạn cần bất cứ thứ gì gần với việc lưu một giá trị cũ, hãy chạy mối quan hệ RACAbleWithStart() của bạn thông qua một RACReplaySubject (nó không hoàn hảo, nhưng nó sẽ hoạt động). – CodaFi

Trả lời

4

Tôi đã sử dụng đoạn mã này với thành công:

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

Nguồn: ReactiveCocoa documentation

Các vấn đề liên quan