当我的应用程序启动时,它会将一组实体与服务器同步。 在此同步期间,它会更新核心数据中的实体并保存它。 如果您打开应用程序(同步开始),然后我按下应该显示 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/