2015-06-21 59 views
0

如果我有以下數據模型:收穫全部財產志願通知和變化遞歸在頂層

Model 
    - subModels (NSMutableArray * of type SubModel) 

SubModel 
    - text 
    - createdAt 

是有可能使用KVO觀察父Model類發生變化,仍然收到變更通知關係模型的屬性?

使用ReactiveCocoa,就是我試圖完成會是這個樣子:

self.model = [Model new]; 
self.model.subModels = [NSMutableArray array]; 
SubModel *subModelOne = [SubModel new]; 
[self.model mutableArrayValueForKeyPath:@"subModels"] addObject:subModelOne]; 
[RACObserve(self, model) subscribeNext:^(id next){ 
    NSLog(@"%@", next); 
}]; 
subModelOne.text = @"Lollipop, lollipop, oh lolli lolli lolli lollipop!"; 

我希望發生的是我會從添加初始化model.subModels爲空數組,一個獲得了下一個事件一個關係的子模型,最後一個來自設置subModelOne.text。基本上,我希望所有的子屬性,子模型等,KVO通知傳播鏈上,但我不知道如何完成這項任務。

+0

只是要清楚,你想有一個志願的答案,而不是一個RAC嗎? –

+0

RAC會更好。我發現這個:https://github.com/ReactiveCocoa/ReactiveCocoa/issues/1195,我還沒有機會看看/評估它呢 – barndog

回答

1

在你的問題的最後一段是關鍵的解決方案:

我希望發生的是我會從初始化model.subModels爲空數組獲得下一個事件...

所以我們將有一個信號在model上觀看subModels財產。

一個從添加子模型的關係,

不知道,如果你可以專門做這個。使用KVO,當您觀察某個屬性時,您正在觀察該屬性的更改,因此當您觀察屬性爲NSMutableArray對象時,將不會收到通知,直到您更改對象,我的意思是:指定一個向該屬性添加新數組。從數組中添加或刪除項目不算作「更改屬性」。因此,理想的做法是使用不可變數組,當需要更改項目時,根據需要創建新的NSArray並將其分配給屬性。然後你可以觀察它。您正在使用mutableArrayValueForKey:,這顯然使得count屬性符合KVO。我從來沒有用過它,所以我不知道atm。選擇哪種選擇取決於你。

最後一個來自設置subModelOne.text。

我們最後的信號將會觀察subModeltext財產。

如果你想發送你的事件,所有這些變化的一個信號,你用combineLatest:reduce:

RACSignal* subModelsSignal = [RACObserve(self.model, subModels) startWith:self.model.subModels]; 
RACSignal* textSignal = [RACObserve(subModel, text) startWith:subModel.text]; 
... 
NSArray* allSignalsYouWantCombined = @[subModelsSignal, textSignal, ... ]; 
RACSignal* combined = [RACSignal combineLatest:allSignalsYouWantCombined reduce:^(NSArray* subModels, text, ...) { ... }];