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

Posted

技术标签:

【中文标题】核心数据:更新托管对象不会调用 NSFetchedResultsControllerDelegate【英文标题】:Core Data: updating a managed object doesn't call the NSFetchedResultsControllerDelegate 【发布时间】:2010-08-31 08:48:06 【问题描述】:

当我以编程方式更改某些现有托管对象属性时,我的表格视图没有更新,这有问题。我希望我的NSFetchedResultsControllerDelegate 在这种情况下会被调用,但事实并非如此。

苹果文档说:

NSFetchedResultsController 的实例使用此协议中的方法通知其委托,控制器的获取结果已因添加、删除、移动或 更新 操作而更改。

更详细地说,我的托管对象是一个名为status 的int 属性,它从enum 中获取值。我的表格视图只显示那些其status 等于upToDate(枚举值之一)的对象。为此,我的 FetchedResultController 有一个谓词来测试该状态:

predicate = [NSPredicate predicateWithFormat:@"doc.status == %d", upToDate];

它工作正常,但是当我将过期对象更改回状态upToDate 时,更新不会反映出来。我的代码是根据 Apple 的模板修改的。

这是我尝试过的:

myObject.status = [NSNumber numberWithInt:upToDate];
[managedObjectContext save:nil];
[managedObjectContext processPendingChanges];
[myTableView reloadData];

最后,我设法通过调用来更新我的表格视图:

[fetchedResultsController performFetch:&error];
[myTableView reloadData];

但即便如此,我的 NSFetchedResultsControllerDelegate 方法都没有被调用,这与 Apple 的文档相矛盾。此外,不会发生流畅的动画。

我预计会调用 controllerWillChangeContent:controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:controllerDidChangeContent:

我想我错过了一些东西,可能是一些明显的东西,但我看不出是什么。 performFetch: 是否需要在某些托管对象可能发生变化时被调用? NSFetchedResultsControllerD 真的什么时候调用它的委托?

谢谢。

【问题讨论】:

您找到了解决此问题的方法吗?我面临着类似的情况,我的委托回调永远不会为更新操作触发。无论如何,添加新对象或删除现有对象都会调用委托方法。可能是什么原因? 【参考方案1】:

如果无论更改的类型如何,FRC 委托方法都不会被调用,那么最可能的解释是委托没有正确配置。这可能是由以下原因引起的:

    委托很简单,没有设置 委托类未声明NSFetchedResultsControllerDelegate 协议。 您无需合并即可在另一个上下文中进行更改。

我建议捕获保存操作的错误返回,以确保保存没有发生任何事情。

无论是否已保存,都应将其上下文的任何更改通知 FRC。然后 FRC 应通知其代表。

【讨论】:

1. aFetchedResultsController.delegate = self; 存在 2. 仔细检查。 3. 我只有一个上下文,它是从应用程序委托传递的。正如我所写的,它基本上是普通的 Apple 代码。任何其他想法还有什么要检查的?当然,我从保存中捕获了错误。我只是为这个问题简化了我的代码 sn-p。【参考方案2】:

我刚刚在 initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName: 中发生了这种情况,然后 sectionNameKeyPath 不为零。如果我确保 sectionNameKeyPath 为 nil,那么我会得到预期的更新。

我仍在调查为什么会发生这种情况

【讨论】:

以上是关于核心数据:更新托管对象不会调用 NSFetchedResultsControllerDelegate的主要内容,如果未能解决你的问题,请参考以下文章

更改托管对象属性不会触发 NSFetchedResultsController 更新表视图

更新当前的 CoreData 条目

核心数据:SQLite 没有立即更新

核心数据 - 2 个对象模型,1 或 2 个托管对象上下文 - 哪个更好?

在核心数据线程安全中同时枚举托管对象

如何更新托管对象数据?