核心数据对象在其相关对象的属性更改时更新

Posted

技术标签:

【中文标题】核心数据对象在其相关对象的属性更改时更新【英文标题】:Core Data object update when a property of its related object changes 【发布时间】:2010-12-04 07:28:58 【问题描述】:

我仍然习惯于 Core Data 的工作方式,我已经四处寻找有关我的问题的信息,但我没有找到任何明显解决我确切问题的答案。

我有三类托管对象:loan、borrower 和 photo。借款人对象与贷款对象具有一对多的关系(意味着借款人可以拥有多个贷款,但贷款只能拥有一个借款人)。借用对象也与照片对象具有一对一的关系。

我正在使用 NSFetchedResultsController 来使表与一组贷款对象的更改保持同步。当其他借用者属性更改时,更改通知会到达 NSFetchedResultsController 并且我的表会更新。但是当 photo 属性更改为指向另一个照片对象时,则不会向 NSFetchedResultsController 传递任何通知。当借款人更改照片关系时,似乎没有任何与借款人相关的贷款被告知。

请帮忙!

【问题讨论】:

【参考方案1】:

您可以尝试处理NSManagedObjectContextObjectsDidChangeNotification 通知。

【讨论】:

+1 这是最好的选择。这种情况就是通知的用途。 酷,这就像一个魅力。感谢所有提供帮助的人!【参考方案2】:

这有点松鼠,但您可以执行以下操作,假设您已将 NSManagedObject 子类化为 Loan、Borrower 和 Photo 类。

1.) 在 Loan 中,为外借照片的 'image' 属性设置 KVO。

2.) 在 Loan 中,添加 changeCount 属性 (NSNumber*)。

3.) 当提醒贷款更改其照片的图像时,增加 changeCount。

所以,在非常粗糙的代码中,是这样的:

在 Load.m 中:

- (void) awakeFromFetch
    
    [super awakeFromFetch];

    [[self photo] addObserver:self
        forKeyPath:@"image"
        options:NSKeyValueObservingOptionNew
        context:nil];
    


- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    
    if ([keyPath isEqualToString:@"image"])
        
        NSInteger temp = [[self changeCount] intValue];
        ++temp;
        [self setChangeCount:[NSNumber numberWithInteger:temp]];
        
    

有一些注意事项。

1) 这仅处理 'fetch' 而 处理 'insert'(即新贷款)。

2) 这假设提取的贷款会有照片。

3) 这假设您已将“changeCount”属性添加到 Loan。

4) 我没有对此进行测试,尽管我在我的一个应用程序中使用了远程类似的机制。

【讨论】:

你能给我看一些示例代码吗?我还不太熟悉 KVO 或如何指定从贷款到借款人照片的图像属性的关键路径。 好的,我想我可以使用该代码。谢谢!唯一的变化是,有照片的是借款人,而不是贷款。所以我实际上需要修改代码来观察贷款借款人的图像属性。在那种情况下,关键路径会是“borrower.image”而不是“image”吗? 我想是这样,但我不确定。很想知道你在这方面的表现如何。

以上是关于核心数据对象在其相关对象的属性更改时更新的主要内容,如果未能解决你的问题,请参考以下文章

更改未保存在核心数据模型中(例如删除对象)

核心数据:如何根据相关实体的属性获取实体

核心数据:更新托管对象不会调用 NSFetchedResultsControllerDelegate

在更新流星模板后运行函数

核心数据麻烦排序相关对象的 NSSet

React - setState() 不更新叶级属性