相关疑难解决方法(0)

如何刷新NSFetchedResultsController?

我有一个NSFetchedResultsController,它在UITableView中显示数据.在选择创建Core Data项目时,我正在使用Xcode提供的样板代码.我将以下谓词添加到NSFetchedResultsController使用的NSFetchRequest中(在NSFetchedResultsController初始化之前):

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deleted == NO"];
[fetchRequest setPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

现在在我的应用程序的另一个位置,我像这样设置已删除的属性(伪代码):

myManagedObject.deleted = YES
saveDataContext
Run Code Online (Sandbox Code Playgroud)

当我返回TableViewController时,它仍然显示这个"已删除"的行.

当我尝试重新加载表视图时,没有任何反应.

当我尝试使用时重新加载fetchedResultsController时performFetch,它说:

'致命错误:部分信息的持久缓存与当前配置不匹配.您已经非法改变了NSFetchedResultsController的获取请求,其谓词或其排序描述符,而无需禁用缓存或使用+ deleteCacheWithName:'

如果我删除缓存,在init方法中调用performFetch,然后调用[myTable reloadData]它.

是不是有更简单的方法来刷新数据?最好是允许你使用NSFetchedResultsController的缓存功能吗?

据我所知,我修改获取请求,谓词或排序描述符的唯一地方是在分配和插入NSFetchedResultsController的相同方法中,因此它显示的错误消息似乎不正确.

更新:现在我理解NSFetchedResultsController了一点,我明白它不会自动删除行,而且它controller:didChangeObject:atIndexPath:forChangeType:nowIndexPath:是主要负责删除行的方法.我已经实现了这个方法,因为我在项目中使用了Apple的模板.

但是,在我的情况下,我实际上并没有删除一个项目,我只是更新一个property(deleted)来指定该项目不再存在于列表中.这意味着该controller:didChangeObject:atIndexPath:forChangeType:nowIndexPath:方法的改变类型为NSFetchedResultsChangeUpdate,而不是NSFetchedResultsChangeDelete.我将代码更新为:

  case NSFetchedResultsChangeUpdate: {
    MyObj *obj = (MyObj *)anObject;
    if (obj.deletedValue) { // NOTE: deletedValue returns the deleted property as BOOL
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else {
      [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
      break;
    }
  } …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch core-data objective-c nspredicate nsfetchedresultscontroller

2
推荐指数
1
解决办法
8019
查看次数