NSFetchedResultsController - 更改Predicate的Runtime变量

时间:2014-08-05 08:14:56

标签: uitableview core-data nspredicate nsfetchedresultscontroller nsfetchrequest

关于这个主题有很多问题,但可能都太具体而且不简洁。

我有一个NSFetchedResultsController。它最初获取我需要的数据。当我更新会影响NSFetchRequest的NSPredicate结果的数据模型时,内容不会更新。

更具体地说,我有一个Permissions模型。有数据对象被分配了权限,然后有些用户拥有这些权限的子集,尽管数据对象的权限与用户的权限不同;他们共享相同的controlKey。

所以,NSPredicate是:

[NSPredicate predicateWithFormat:@"controlKey IN %@", [[User currentUser].permissions valueForKey:@"controlKey"]];

问题是,如果我创建并添加权限,当我保存NSManagedObjectContext时,内容不会更新(是的,我正在观察它。不,我没有使用缓存,所以没有删除)。

我非常相信它是因为谓词。它与最初的数组仍然相同,并且不会更新。

我的问题是,我如何编写一个谓词,让我得到我想要的但仍然保持"动态" ?在添加此对象时,可以使用UITableView动画。

3 个答案:

答案 0 :(得分:2)

这是你需要做的。检测到变化时,

self.fetchedResultsController.predicate = //new predicate
[self.fetchedResultsController performFetch:nil];
[self.tableView reloadData];

或者有时需要擦拭FRC清洁。

_predicate = // new predicate, put it into an ivar
self.fetchedResultsController = nil;
[self.tableView reloadData];  // lazily re-instantiate FRC with _predicate

这可能很昂贵,但为了获取动画,您可以尝试使用以下内容替换reloadData

[self.tableView beginUpdates];
[self.tableView endUpdates];

答案 1 :(得分:1)

您从一组权限中查询控制键,并将它们传递给谓词。谓词本身无论如何都不是动态的,它只是获取动态的结果。所以,你无法做到你想要的。

相反,您应该观察用户的权限更改,创建新谓词,更新FRC并重新执行它(更改谓词后的要求,因为它应该是静态的)。

答案 2 :(得分:0)

我尝试使用以下代码段,它适用于我:

[NSFetchedResultsController deleteCacheWithName:nil];  
[self.fetchedResultsController.fetchRequest setPredicate:predicate];  // set your new predicate

NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
    NSLog(@"%@, %@", error, [error userInfo]);
    abort();
}