Ios 如何更新NSFetchedResultsController?

Ios 如何更新NSFetchedResultsController?,ios,core-data,restkit,nsfetchedresultscontroller,restkit-0.20,Ios,Core Data,Restkit,Nsfetchedresultscontroller,Restkit 0.20,我正在我的ViewController中使用RestKit和NSFetchedResultsController构建一个iOS应用程序,如以下教程中所述: 我有一个UITableViewController的子类,它显示由NSFetchedResultsController获取的数据,并且运行良好 现在我想过滤显示的数据,因此我将向NSFetchedResultsController的获取请求添加一个谓词,并再次执行获取(我不使用任何缓存): 没有发生错误,但表视图未更新。我希望调用此方法 -

我正在我的ViewController中使用RestKit和NSFetchedResultsController构建一个iOS应用程序,如以下教程中所述:

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

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

没有发生错误,但表视图未更新。我希望调用此方法

- (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,从而重新加载表视图呢?而且FetchedObject还包含一些

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

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

[NSPredicate predicateWithFormat:@"ANY transformable_attribute like 'search string'"]
奇怪的是,如果我在没有谓词的情况下加载结果,然后添加它,则得到0个对象,但如果我直接使用谓词加载结果,则得到3个对象。 我的谓词错了吗


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

更改
NSFetchedREsultsController的谓词不会导致对
controllerdChangeContent
的委托调用。从文件中:

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]

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

您需要更改谓词以获得预期的结果

召唤


在执行提取后更新表

这是其中奇怪的部分。当我第一次加载结果时,我得到18个对象,然后当我添加谓词时,我得到0个对象。但是如果我第一次用谓词加载结果,那么我会得到3个objects,比如谓词或数据在这两种情况下是不同的。
[tableView reloadData]
[self.tableView reloadData];