我正在尝试以多线程方式使用核心数据.我只是想在后台下载新数据时显示以前下载的数据的应用程序.这应该让用户在更新过程中访问应用程序.
我有一个NSURLConnection使用委托异步下载文件(并显示进度),然后我使用XMLParser解析新数据并在单独的上下文中创建新的NSManagedObjects,具有自己的persistentStore并使用单独的线程.
问题是在显示新对象时在旧对象的同一上下文中创建新对象会抛出BAD_INSTRUCTION异常.所以,我决定为新数据使用单独的上下文,但是我无法找到一种方法,一旦完成就将所有对象移动到其他上下文.
Paolo又名SlowTree
我有一个应用程序需要大约一分钟的时间来设置,所以当用户点击“开始新游戏”时,我想在数据加载到核心数据时显示一个活动微调器。
我知道我必须在后台线程上执行此操作,以便我可以在主线程上更新 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)
}
}
Run Code Online (Sandbox Code Playgroud)
在 importDefaultData() 中,我需要多次保存,但是当我尝试这样做时它会崩溃。我现在明白这是因为我试图从后台线程访问主上下文。下面是函数的基本结构:
func importDefaultData() {
// import data into Core Data here, code not shown for brevity
saveContext()
// import more data into …Run Code Online (Sandbox Code Playgroud)