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

Receive KVO notifications for all property and changes recursively at top level

如果我有以下数据模型:

Model
    - subModels (NSMutableArray * of type SubModel)

SubModel
    - text
    - createdAt

是否可以使用 KVO 来观察父级 Model class 的变化并且仍然接收关系模型属性的变化通知?

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

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

What I want to happen is I would get a next event from initializing model.subModels to an empty array...

所以我们将在 model.

上观看 subModels 属性 的一个信号

one from adding a sub model to the relationship,

不确定您是否可以专门执行此操作。使用 KVO,当您观察 属性 时,您正在观察 属性 的变化,因此当您观察 属性 这是一个 NSMutableArray 对象时,您将不会收到通知,直到 你更改对象 ,我的意思是:为那个 属性 分配一个新数组。从数组中添加或删除项目不算作 "changing the property"。因此,理想的做法是使用不可变数组,当您需要更改项目时,根据需要创建一个新的 NSArray 并将其分配给 属性。然后你可以观察它。您正在使用 mutableArrayValueForKey:,这显然使 count 属性 KVO 兼容。我从未使用过它,所以我不确定 atm。选择哪个选项取决于您。

and finally one from setting 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, ...) { ... }];