我是这家核心数据业务的新手。
我有一个与NSFetchedResultsController连接的UITableViewController。在viewDidLoad
中,我触发了从服务器获取必要数据的请求,然后使用[self.fetchedResultsController performFetch:&error]
更新表视图。在此之前一切正常。
现在我想将数据提取移动到另一个线程,因此在应用程序从服务器收到NSArray对象后,它会在主线程上执行didFinishFetchingItems
选择器。在该选择器中,我将NSArray保存到Core Data存储并让fetchedResultsController
执行获取。虽然NSLog
显示数据仍然存在(例如[[fetchedResultsController fetchedObjects] count]
返回100),但没有数据显示。我必须在方法的末尾放置一个[self.tableView reloadData]
来手动刷新表视图。
我的问题是:我做错了什么?为什么我需要手动刷新表视图?
答案 0 :(得分:2)
您不应该在非主线程中触摸NSFetchedResultsController,这不是线程安全的操作。
如果您在获取时遇到很长的延迟,则需要使用单独的NSManagedObjectContext进行后台提取。如果在后台执行单独的提取,它会将数据加载到缓存中,然后NSFetchedResultsController将命中缓存而不是磁盘,从而加快主线程的检索速度。
答案 1 :(得分:1)
您无需手动刷新任何内容; fetchedResultsController为你做到了。
您需要做的是为某个对象实现NSFetchedResultsControllerDelegate,并将该对象设置为fetchedresultscontroller的委托。
请参阅this了解您需要实施的内容。如果您的模型很简单,您几乎可以将该代码复制粘贴到您的委托中,一切正常。
重要的是保持结果控制器和其他代码片段对同一个托管对象上下文起作用。这就是resultscontroller可以获取更改的方式。但是,在核心数据指南中,有一些关于多线程的注意事项,因此请确保覆盖了线程基础,然后一切正常。