我正在我的 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 个对象。我的谓词错了吗?
编辑:是的!看起来我们不能断言可转换的属性。我不知道为什么它第一次起作用。