2016-10-01 3 views
0

Ich versuche Nachrichten in der Hintergrundwarteschlange zu speichern und sie an die Haupt-Push Warteschlange, indem Sie zwei Kontexte Eltern und Kind verwenden. aber meine App stürzt ständig ab. Früher habe ich Äpfel docs, nicht sicher, warum es nicht funktioniert ...(SWIFT 3) übergeordneten Kind Kontext Absturz Core-Daten (libC++ abi.dylib: Beenden mit nicht abgefangenen Ausnahme des Typs NSException (Recorded Frame))

Core Data, Multithreading, and the Main Thread

hier ist mein Code:

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) 
    } 

    } 

auch hier ist meine Stacktrace: enter image description here

Antwort

2

Ok, so gibt es sind zwei Probleme, die Sie haben.

Die erste besteht darin, dass Sie den übergeordneten Kontext nicht festgelegt haben. Wenn Sie dies nicht tun, wird nichts an den verwalteten Hauptkontext weitergegeben.

Die zweite besteht darin, dass Sie den privaten verwalteten Kontext in seinem eigenen Block nicht ändern. Genauso wie der normale verwaltete Kontext ausgeführt werden muss (was Sie getan haben), muss der private Kontext dasselbe tun.

So der fertige Code sollte wie folgt aussehen: -

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) 
    } 

    } 
} 
Verwandte Themen