我有一个核心数据对多关系,由父项<->>子项组成。我想设置一个键值观察机制,这样当子对象上的属性(例如firstName、lastName)发生变化时,它就会触发通知。使用标准KVO语法时:
[self.parentObject addObserver:self forKeyPath:@"children" options:NSKeyValueObservingOptionNew context:NULL]这仅在关系本身被修改时通知(即,在关系中添加或删除子对象),而不是在这些子对象之一的属性更改时通知。显然,这就是它设计的操作方式,所以发生这种情况没有什么错,但是我如何使用KVO来实现我想要的需求呢?
提前感谢!
发布于 2011-12-01 17:23:13
AFAIK没有内置的方法来观察单行代码的集合对象属性。相反,当从集合中插入/删除对象时,您必须添加/删除观察者。
可以在这里找到解释和示例项目:https://web.archive.org/web/20120319115245/http://homepage.mac.com/mmalc/CocoaExamples/controllers.html (请参阅“观察集合不同于观察集合中对象的属性”部分)
更新:
链接断开-我将其更改为archive.org快照。
发布于 2013-10-05 04:28:43
回答有点晚了,但也许对谷歌这篇文章的人会有帮助。
您可以使用谓词@"parent == %@", child为实体子实体设置一个NSFetchedResultsController,然后将控制器作为委托添加到该fetchedResultController。当子元素的任何属性改变时,以及添加属性时,都会调用委托。下面是一个示例代码。我还添加了一个排序描述符,用于将子项按名称排序到
...
NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Child"];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"parent = %@", parent];
self.fetchResultsController.fetchRequest.predicate = predicate;
self.fetchResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest managedObjectContext:context
sectionNameKeyPath:nil cacheName:nil];
self.fetchResultsController.delegate = self;
...然后实现委托方法
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {以及您的实现所需的任何其他委托方法(文档中有一个非常好的代码片段
https://stackoverflow.com/questions/8336982
复制相似问题