3

我正在我的 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 个对象。我的谓词错了吗?

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

4

2 回答 2

4

更改 a 的谓词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]
于 2013-08-22T14:19:39.287 回答
4

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

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

称呼

[self.tableView reloadData]; 

在执行获取更新表之后。

于 2013-08-22T23:01:28.487 回答