【发布时间】:2016-11-02 00:46:31
【问题描述】:
我有以下核心数据实体:
@interface Car (CoreDataProperties)
@property (nullable, nonatomic, retain) NSSet<Part *> *parts;
@end
@interface Part (CoreDataProperties)
@property (nullable, nonatomic, retain) Car *car;
@end
这是汽车和零件之间的一对多关系。在我的一个视图控制器中,我显示了一个包含所有部件的汽车视图。我想听听汽车零件的变化。
我认为使用 KVO 会很容易。
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.car addObserver:self forKeyPath:@"parts" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil];
}
然后:
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([@"parts" isEqualToString:keyPath]) {
// do what I need to do with new parts
}
}
但是,当我从服务器拉取更改以更新汽车零件时,即使我没有更改任何零件,也会收到对 observeValueForKeyPath 方法的意外回调。
希望使用 KVO,但也许使用 coredata 对象并不是一个好主意。我做错了什么还是应该使用替代方法?
如果我不应该使用 KVO,我相信我的其他选择是: 1. 监听 MOC 变化。这不是很好,因为我真的不知道对象发生了什么变化。 2. 在带有谓词的部件上实现 FetchedResultsController 以仅查找我感兴趣的汽车。看起来有点矫枉过正,但我认为这将满足我的需求。
【问题讨论】:
标签: ios core-data nsfetchedresultscontroller key-value-observing