如果我有以下数据模型:
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 :(得分:1)
问题的最后一段是解决方案的关键:
我想要发生的是从初始化model.subModels到空数组我会得到下一个事件......
因此,我们会在subModels
上看到model
属性的一个信号。
将一个子模型添加到关系中,
不确定您是否可以专门执行此操作。使用KVO,当您观察属性时,您正在观察对该属性的更改,因此当您观察到属性为NSMutableArray
的对象时,在更改对象之前,您将不会收到通知,我的意思是:为该属性分配一个新数组。在数组中添加或删除项目不算作“更改属性”。因此,执行此操作的理想方法是使用不可变数组,当您需要更改项目时,根据需要创建新的NSArray
并将其分配给属性。然后你可以观察它。您正在使用mutableArrayValueForKey:
,这显然使count
属性符合KVO标准。我从来没有用过它所以我不确定atm。选择哪个选项取决于您。
最后设置了subModelOne.text。
我们的最后一个信号是观看text
的{{1}}属性。
如果您希望单个信号向您发送所有这些更改的事件,请使用subModel
:
combineLatest:reduce: