【发布时间】:2018-09-02 10:38:49
【问题描述】:
我有一个应用程序需要大约一分钟的时间来设置,所以当用户点击“开始新游戏”时,我想在数据加载到 Core Data 时显示一个活动微调器。
我知道我必须在后台线程上执行此操作,以便我可以在主线程上更新 UI,但我不知道如何在后台线程中保存托管上下文。这是我目前所拥有的:
func startNewGame() {
initiateProgressIndicator() // start the spinner and 'please wait' message
DispatchQueue.global(qos: .background).async {
self.coreDataStack.importDefaultData() // set up the database for the new game
DispatchQueue.main.async {
stopProgressIndicator()
// Transition to the next screen
let vc: IntroViewController = self.storyboard?.instantiateViewController(withIdentifier: "IntroScreen") as! IntroViewController
vc.rootVCReference = self
vc.coreDataStack = self.coreDataStack
self.present(vc, animated:true, completion:nil)
}
}
在 importDefaultData() 中我需要保存多次,但是当我尝试这样做时它会崩溃。我现在明白这是因为我试图从后台线程访问主上下文。下面是函数的基本结构:
func importDefaultData() {
// import data into Core Data here, code not shown for brevity
saveContext()
// import more data into Core Data here, code not shown for brevity
saveContext()
// import final data here
saveContext()
}
根据我的阅读,我认为我需要为后台线程创建另一个托管对象上下文,但我不清楚如何去做以及如何将其融入我当前的代码中。在进入下一个屏幕之前,我也不知道如何确保正确保存数据。我没有多线程方面的经验,因此我们将不胜感激。
编辑:关于被标记为重复,建议的主题是 8 岁,不包含任何答案。我希望通过 Swift 中的简短代码示例获得更新的答案。
【问题讨论】:
-
链接帖子中的 Apple Doc 链接似乎不再有效
-
let childContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)childContext.parent = parentContext -
在
context.performAndWait { }或context.perform { }内进行所有更改和保存 -
感谢@user1046037,您的 cmets 让我走上了正确的道路 :)
标签: ios swift multithreading core-data