接收所有 属性 的 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.
我们的最后一个信号将是观看 subModel
的 text
属性。
如果您想要一个信号向您发送所有这些更改的事件,您可以使用 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, ...) { ... }];
如果我有以下数据模型:
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.
我们的最后一个信号将是观看 subModel
的 text
属性。
如果您想要一个信号向您发送所有这些更改的事件,您可以使用 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, ...) { ... }];