在多对多关系中的KVO对象属性

我有一个由父<— >>子组成的核心数据对多关系。 我想build立一个键值观察机制,当任何一个Child对象的属性(例如firstName,lastName)改变时,它触发一个通知。 使用标准KVO语法时:

[self.parentObject addObserver:self forKeyPath:@"children" options:NSKeyValueObservingOptionNew context:NULL] 

这只会在关系本身被修改(即一个Child对象被添加或从关系中删除)时通知,而不是当这些Child对象之一的属性发生更改时。 显然这就是它的devise如何运作,所以没有什么错,但我怎样才能使用KVO来达到我想要的要求呢?

提前致谢!

AFAIK没有内置的方法来观察收集对象属性与一行代码。 相反,您必须添加/删除观察员对象被插入/从您的集合中删除。

一个解释和示例项目可以在这里find: https : //web.archive.org/web/20120319115245/http : //homepage.mac.com/mmalc/CocoaExamples/controllers.html (请参阅“观察集合是不一样的观察集合中的对象的属性“部分)

更新:
链接断了 – 我把它改成了archive.org的快照。

有点迟到的答案,但也许这将是有益的人谁googles这个。

您可以使用谓词@"parent == %@", child为实体子设置NSFetchedResultsController,然后将您的控制器作为委托添加到fetchedResultController。 当任何一个孩子的属性发生变化,以及他们被添加时,代理将被调用。下面是一个示例代码。 我还添加了一个sorting描述符来按照他们的名字sorting

 ... 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 { 

还有其他的代理方法,你需要为你的实现(文档有一个非常好的代码片断