ios - 同时写入和读取核心数据导致 UI 卡住,直到写入完成

标签 ios objective-c core-data nsfetchedresultscontroller

当我的应用程序启动时,它会将一组实体与服务器同步。 在此同步期间,它会更新核心数据中的实体并保存它。 如果您打开应用程序(同步开始),然后我按下应该显示 tableView 的选项卡栏按钮(带有 NSFetchedResultsController),它会卡住片刻。

我真的不知道去哪里寻找问题。

更新一些额外的信息:

我正在使用一个主(父)上下文,用于获取 NSFetchedResultsController 和同步类中用于下载和保存更改的子上下文。

完成所有更改后,我依次保存子上下文和父(主)上下文。 (我认为这是需要的。)。

最佳答案

我从你的陈述中假设你的主上下文是这样创建的

let mainContext = NSManagedObjectContext.init(concurrencyType: NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType)
    mainContext.persistentStoreCoordinator = CoreDatStack.sharedStack.persistentStoreCoordinator

您已经创建了子上下文,如下所示

let childContext = NSManagedObjectContext.init(concurrencyType: NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType)
    childContext.parent = mainContext

卡住的原因:您的 mainContext 保存操作在 MainThread 上执行(因为写入磁盘(持久存储)是一个缓慢的过程),因此阻塞主线程直到保存操作完成。

解决方案:将与 PersistentStoreCoordinator 链接的上下文放在 privateQueue 上,这样保存就不会在 Main Queue 上执行。

关于ios - 同时写入和读取核心数据导致 UI 卡住,直到写入完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19980053/

相关文章:

ios数据存储和webservice查询最佳实践?

ios - 如何根据 PFRelation 更改图像?

ios - UIView无边框

objective-c - 模态视图 Controller 不能正确旋转

ios - 核心数据实体在启动之间不保存

iphone - 核心数据 - 在 vi​​ewDidLoad 之前调用数据源方法

ios - 如何在没有反斜杠的情况下转义整个字符串?

iphone - 如何在NSCalender中设置事件?

ios - 在didEnterRegion,didExitRegion情况下的HTTP请求

objective-c - 保存自定义对象的 NSArray