首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多对多关系中的KVO对象属性

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

Stack Overflow用户
提问于 2011-12-01 13:34:38
回答 2查看 1.4K关注 0票数 4

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

代码语言:javascript
复制
[self.parentObject addObserver:self forKeyPath:@"children" options:NSKeyValueObservingOptionNew context:NULL]

这仅在关系本身被修改时通知(即,在关系中添加或删除子对象),而不是在这些子对象之一的属性更改时通知。显然,这就是它设计的操作方式,所以发生这种情况没有什么错,但是我如何使用KVO来实现我想要的需求呢?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-01 17:23:13

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

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

更新:

链接断开-我将其更改为archive.org快照。

票数 4
EN

Stack Overflow用户

发布于 2013-10-05 04:28:43

回答有点晚了,但也许对谷歌这篇文章的人会有帮助。

您可以使用谓词@"parent == %@", child为实体子实体设置一个NSFetchedResultsController,然后将控制器作为委托添加到该fetchedResultController。当子元素的任何属性改变时,以及添加属性时,都会调用委托。下面是一个示例代码。我还添加了一个排序描述符,用于将子项按名称排序到

代码语言:javascript
复制
...
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;
...

然后实现委托方法

代码语言:javascript
复制
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath {

以及您的实现所需的任何其他委托方法(文档中有一个非常好的代码片段

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8336982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档