2015-06-21 57 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, ...) { ... }];