数据源与后台 NSManagedObjectContext 合并后 UITableView 不会重新加载

Posted

技术标签:

【中文标题】数据源与后台 NSManagedObjectContext 合并后 UITableView 不会重新加载【英文标题】:UITableView does not reload after data source merging with background NSManagedObjectContext 【发布时间】:2013-08-29 05:57:36 【问题描述】:

在我的视图控制器中,我有一个使用NSFetchedesultsController 作为数据源的表视图。而且我必须在后台线程中使用另一个NSManagedContext 实例从服务器加载数据。在将前台上下文与后台上下文合并后,我需要在表视图中反映更改,以便我重置NSFetchedResultsController(这样它将再次获取新到达的数据),然后重新加载表视图。

很奇怪,我的表格视图似乎直到几秒钟后才重新加载(有时更长)。而且我确信这不是因为获取,因为当我滚动表格视图时,新数据会立即出现。

任何建议如何解决这个问题?

提前致谢!

【问题讨论】:

【参考方案1】:

获取数据并创建托管对象后,您需要立即保存背景上下文,这些对象将合并到父上下文中,您可以仔细检查对父上下文所做的任何更改 [上下文 hasChange] [上下文更新对象] [上下文插入对象] 保存的对象仍在内存中,您需要重置背景上下文清除它们

【讨论】:

【参考方案2】:

结果是我不明白通知回调函数在哪里被调用。我在 NSManagedObjectContextDidSaveNotification 回调函数中重新加载我的表视图。当我检查它在这个函数中的哪个线程时,我发现它在我假设的主线程之外的另一个线程上运行。所以我使用 GCD 回到主线程并解决了问题。

【讨论】:

【参考方案3】:

保存操作应该在子上下文的私有队列上进行,这样你就不必听通知,嵌套块等待所有事情完成并重新获取。

【讨论】:

以上是关于数据源与后台 NSManagedObjectContext 合并后 UITableView 不会重新加载的主要内容,如果未能解决你的问题,请参考以下文章

过滤后的 SwiftUI CoreData 列表中的 Sum 属性

通过AngularJS实现前端与后台的数据对接

js前台与后台数据交互-前台调后台

vue中mock数据与后台接口数据的切换

八后台与数据库(IVX 快速开发教程)

在 NSManagedObjectContextObjectsDidChangeNotification 中 NSUpdatedObjectsKey 和 NSRefreshedObjectsKey 有