【问题标题】:NSFetchedResultsController - Change in Runtime variable for PredicateNSFetchedResultsController - 谓词的运行时变量更改
【发布时间】:2014-08-05 08:14:56
【问题描述】:

关于这个主题有很多问题,但可能都太具体了,也没有太简洁。

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

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

所以,NSPredicate 是:

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

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

我很确信这是因为谓词。它仍然与最初的数组相同,并且没有更新。

我的问题是,我如何编写一个谓词来得到我想要的但仍然保持“动态”?在添加这个对象时,如果有 UITableView 动画就好了。

【问题讨论】:

  • 你实现了 NSFetchedResultsController 委托吗?
  • 是的,我做到了。那里没问题。

标签: uitableview core-data nspredicate nsfetchedresultscontroller nsfetchrequest


【解决方案1】:

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

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];

【讨论】:

    【解决方案2】:

    您从一组权限中查询控制键并将它们传递给谓词。无论如何,谓词本身都不是动态的,它只是动态获取的结果。所以,你不能完全按照你的意愿去做。

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

    【讨论】:

    • 我理解原理,但代码逃过我。观察用户权限的变化。 KVO 权限。@count ?如何更新 FRC ? fetchRequest(在 iOS 上)是只读的,这意味着如果我更改/更新/要求重新评估谓词,我需要一个新的 fetchRequest,这意味着我需要一个新的 FRC,这意味着我不会获得 tableView 更新希望。
    • 您可以从 FRC 获取 fetch 请求,给它一个新的谓词并在 FRC 上执行 fetch。可以使用 KVO 或自定义访问器进行观察 - 任何可以告诉您权限集发生了一些变化的东西。
    • 嗯...没用。尽管必须在表格视图上调用 reloadData,但我将不得不解决我当前的解决方案。动画会很好。
    【解决方案3】:

    我已尝试使用以下代码 sn-p,它适用于我:

    [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();
    } 
    

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多