2016-10-01 35 views
0

我試圖將消息保存在背景隊列中,並將它們推送到主通過使用兩個父項和子項的上下文排隊。但我的應用程序不斷崩潰。我用蘋果的文檔,不知道爲什麼它不工作...(SWIFT 3)父子上下文崩潰核心數據(libC++ abi.dylib:以非異常類型NSException(記錄幀)終止)

Core Data, Multithreading, and the Main Thread

這裏是我的代碼:

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) 


let doubletimestamp = Double(timestamp) 
    let date = Date(timeIntervalSinceReferenceDate: (doubletimestamp)) 
    let status = "..." 

    let message = NSEntityDescription.insertNewObject(forEntityName: "Mesages", into: self.privateMOC) as! Mesages 
    message.text = text 
    message.timestamp = date as NSDate   

    do { 
     try self.privateMOC.save() 
     self.inputToolbar.toggleSendButtonEnabled() 

     self.context.performAndWait { 

      do { 
       try self.context.save() 
      } catch { 
       fatalError("Failure to save context: \(error)") 
      } 

     } 

    }catch let err { 
     print(err) 
    } 

    } 

也在這裏是我的堆棧跟蹤: enter image description here

回答

2

好了,所以有是你有兩個問題。

第一個是你沒有設置父上下文。如果你不這樣做,沒有什麼會傳播到你的主要管理上下文

第二個是你不改變它自己的塊中的私人管理上下文。與正常的託管上下文需要運行(您已經完成)相同,私有上下文也需要執行相同的操作。

所以完成的代碼應該是這樣的: -

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) 

private.parentContext = context 

let doubletimestamp = Double(timestamp) 
let date = Date(timeIntervalSinceReferenceDate: (doubletimestamp)) 
let status = "..." 

privateMOC.performBlock { 

    let message = NSEntityDescription.insertNewObject(forEntityName: "Mesages", into: self.privateMOC) as! Mesages 
    message.text = text 
    message.timestamp = date as NSDate   

    do { 
     try self.privateMOC.save() 
     self.inputToolbar.toggleSendButtonEnabled() 

     self.context.performAndWait { 

      do { 
       try self.context.save() 
      } catch { 
       fatalError("Failure to save context: \(error)") 
      } 

     } 

    }catch let err { 
     print(err) 
    } 

    } 
} 
相關問題