2011-12-01 130 views
4

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

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

时的关系本身被修改(即,一个子对象被添加或从关系移除)此仅通知,而不是当这些儿童中的一个的属性对象中的变化。很明显,这是它的设计如何运作,所以这种情况没有任何问题,但是我怎样才能使用KVO来达到我想要的要求?

在此先感谢!

回答

4

AFAIK没有内置的方式来观察集合对象的属性与一行代码。相反,当对象从集合中插入/移除时,必须添加/删除观察者。

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

更新:
链接崩溃 - 我将其更改为archive.org快照。

+0

链接现在被破坏 –

+0

谢谢 - 我更新它指向一个archive.org快照。 –

3

有点迟到的答案,但也许这对某些使用Google的人有用。

您可以使用谓词@"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 { 

而且任何其他委托方法你需要为你实现(文档有这是一个很好的代码片段

相关问题