【问题标题】:Receive KVO notifications for all property and changes recursively at top level在顶层以递归方式接收所有属性和更改的 KVO 通知
【发布时间】:2015-06-21 18:09:17
【问题描述】:

如果我有以下数据模型:

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

【问题讨论】:

标签: key-value-observing reactive-cocoa


【解决方案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, ...) { ... }];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-30
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多