在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?

Posted

技术标签:

【中文标题】在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?【英文标题】:Do I need to update the table view manually after calling performFetch in a Core Data app?在 Core Data 应用程序中调用 performFetch 后,是否需要手动更新表视图? 【发布时间】:2010-01-30 20:10:06 【问题描述】:

我是这个核心数据业务的新手。

我得到了一个与 NSFetchedResultsController 连接的 UITableViewController。在viewDidLoad 中,我发出从服务器获取必要数据的请求,然后使用[self.fetchedResultsController performFetch:&error] 更新表格视图。在那之前一切正常。

现在我想将获取数据的东西移动到另一个线程,所以在应用程序从服务器接收到一个 NSArray 对象后,它会在主线程上执行didFinishFetchingItems 选择器。在该选择器中,我将 NSArray 保存到 Core Data 存储并让 fetchedResultsController 执行提取。没有数据显示,尽管NSLog 表明数据仍然存在(例如[[fetchedResultsController fetchedObjects] count] 返回 100)。我必须在方法末尾添加[self.tableView reloadData] 才能手动刷新表格视图。

我的问题是:我做错了什么?为什么我需要手动刷新表格视图?

【问题讨论】:

我的理解是你应该只为数据的初始加载执行一次 [fetchedRequestController performFetch]。除此之外,正如我在回答中所描述的那样,这完全是关于代表更新数据的问题。 我昨天遇到了完全相同的问题。我猜苹果文档中的 FRC 委托方法样板代码可能有一些盲点,导致它在某些情况下无法按预期更新表格视图。你现在对这个问题有更好的理解了吗?我很高兴听到你的更新。 【参考方案1】:

您不应该在非主线程中触摸您的 NSFetchedResultsController,这不是线程安全的操作。

如果您在获取时有很长的延迟,那么您需要使用单独的 NSManagedObjectContext 进行后台获取。如果您在后台执行单独的提取,它会将数据加载到缓存中,然后 NSFetchedResultsController 将访问缓存而不是磁盘,从而加快主线程上的检索。

【讨论】:

您的意思是“使用单独的 NSManagedObjectContext”?【参考方案2】:

您无需手动刷新任何内容; fetchedResultsController 会为你做这件事。

您需要做的是为某个对象实现 NSFetchedResultsControllerDelegate,并将该对象设置为您的 fetchedresultscontroller 的委托。

请参阅this,了解您需要实施的内容。如果您的模型很简单,您几乎可以将该代码复制粘贴到您的委托中,一切正常。

重要的是让结果控制器和其他代码段都在同一个托管对象上下文中工作。这就是结果控制器获取更改的方式。但是,在 Core Data 指南中,有一些关于多线程的警告,所以请确保你已经覆盖了你的线程基础,然后一切正常。

【讨论】:

我认为问题出在我的多线程代码上,因为在单线程中操作时我不必手动重新加载表格视图。不过,还没有发现它有什么问题。

以上是关于在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?的主要内容,如果未能解决你的问题,请参考以下文章

插入时不调用 Core Data 的自定义验证方法

Core Data 的 Save 方法第一次调用“nil” - 为啥?

Core Data 自定义访问器甚至没有被调用

Core-Data 后台保存性能问题

在共享的 Swift App 框架中使用 Core Data

在 Core Data (IOS) 中保存数据时出错