接收所有属性的KVO通知,并在顶层递归更改

时间:2015-06-21 18:09:17

标签: key-value-observing reactive-cocoa

如果我有以下数据模型:

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通知向上传播,但我不知道如何完成该任务。

1 个答案:

答案 0 :(得分:1)

问题的最后一段是解决方案的关键:

  

我想要发生的是从初始化model.subModels到空数组我会得到下一个事件......

因此,我们会在subModels上看到model属性的一个信号。

  

将一个子模型添加到关系中,

不确定您是否可以专门执行此操作。使用KVO,当您观察属性时,您正在观察对该属性的更改,因此当您观察到属性为NSMutableArray的对象时,在更改对象之前,您将不会收到通知,我的意思是:为该属性分配一个新数组。在数组中添加或删除项目不算作“更改属性”。因此,执行此操作的理想方法是使用不可变数组,当您需要更改项目时,根据需要创建新的NSArray并将其分配给属性。然后你可以观察它。您正在使用mutableArrayValueForKey:,这显然使count属性符合KVO标准。我从来没有用过它所以我不确定atm。选择哪个选项取决于您。

  

最后设置了subModelOne.text。

我们的最后一个信号是观看text的{​​{1}}属性。

如果您希望单个信号向您发送所有这些更改的事件,请使用subModel

combineLatest:reduce: