数据源与后台 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 属性
在 NSManagedObjectContextObjectsDidChangeNotification 中 NSUpdatedObjectsKey 和 NSRefreshedObjectsKey 有