如何更新 NSFetchedResultsController?

Posted

技术标签:

【中文标题】如何更新 NSFetchedResultsController?【英文标题】:How to update a NSFetchedResultsController? 【发布时间】:2013-08-22 14:01:56 【问题描述】:

我正在我的 ViewControllers 中使用 RestKit 和 NSFetchedResultsController 构建一个 ios 应用程序,如以下教程中所述:http://www.alexedge.co.uk/blog/2013/03/08/introduction-restkit-0-20

我有一个 UITableViewController 的子类,它显示 NSFetchedResultsController 获取的数据,它运行良好。

现在我想过滤显示的数据,因此我向 NSFetchedResultsController 的获取请求添加谓词并再次执行获取(我不使用任何缓存):

[self.fetchedResultsController.fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"title like 'some text'"]];
NSError *error = nil;

[self.fetchedResultsController performFetch:&error];

NSAssert(!error, @"Error performing fetch request: %@", error);

没有发生错误,但表格视图没有更新。我期待这个方法被调用

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller;

但不是……

更糟糕的是,当我记录这样获取的对象的数量时

NSLog(@"before refetch : %d objects", self.fetchedResultsController.fetchedObjects.count);

[...]

NSLog(@"after refetch : %d objects", self.fetchedResultsController.fetchedObjects.count);

我来了

before refetch : 18 objects
after refetch : 0 objects

(这可能是我尝试滚动表格视图时应用程序崩溃的原因)

那么我应该如何刷新 NSFetchedResultsController 的内容以便调用 controllerDidChangeContent 从而重新加载表格视图?而且 fetchedObjects 包含一些东西......

编辑: 如果此时我调用 RestKit 对象管理器来获取显示在表视图中的数据并且 Internet 连接可用,那么 NSFetchedResultsController 将被更新并且表视图以及带有谓词的获取请求的正确结果。

编辑: 我使用的谓词是问题的原因(我认为)。我的实体有一个可转换的属性,该属性是从字符串的 JSON 数组和谓词测试中解析的,如果该数组中存在搜索字符串:

[NSPredicate predicateWithFormat:@"ANY transformable_attribute like 'search string'"]

奇怪的是,如果我在没有谓词的情况下加载结果并在之后添加它,那么我会得到 0 个对象,但是如果我直接使用谓词加载结果,那么我会得到 3 个对象。 我的谓词错了吗?

编辑:是的!看起来我们不能断言可转换的属性。我不知道为什么它第一次起作用。

【问题讨论】:

【参考方案1】:

您的谓词是导致 0 个结果的约束。这可能是预期的行为。检查数据存储中的内容,您很可能会发现它遵循谓词和数据的逻辑。

您需要更改谓词以获得您想要的结果。

打电话

[self.tableView reloadData]; 

在执行获取更新表之后。

【讨论】:

这是其中奇怪的部分。当我第一次加载结果时,我得到 18 个对象,然后当我添加谓词时,我得到 0 个对象。但是,如果我第一次使用谓词加载结果,那么我会得到 3 个对象 在这两种情况下,无论是谓词还是数据听起来都不同。【参考方案2】:

更改NSFetchedREsultsController 的谓词不会导致对controllerDidChangeContent 的委托调用。来自文档:

An instance of NSFetchedResultsController uses methods in this protocol to notify 
its delegate that the controller’s fetch results have been changed due to an add, 
remove, move, or update operations.

解决办法是用

重新加载表
[tableView reloadData]

【讨论】:

以上是关于如何更新 NSFetchedResultsController?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能两次获取相同的数据? NSFetchedResultsController 为空

启动 Core Data 应用程序时在后台配置 NSFetchedResultsController

usb驱动程序如何更新,教您如何更新

如何关闭掉eclipse启动的自动更新功能!!

mysql如何让时间属性不自动更新

如何关闭MyEclipse自动更新