核心数据:更新托管对象不会调用 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 更新表视图