2016-07-10 14 views
0

Kontext Setup: Child (private Warteschlange) -> Parent (Hauptwarteschlange) -> persistente Speicherung CoordinatorCore Data Eltern Kind Kontext Race-Bedingung

Etwa 50% der Zeit, wenn mein Kind Kontext speichern, meine Eltern/main Kontext erkennt die Änderungen nicht und speichert daher nie in dem persistenten Speicher.

func saveContext(context: NSManagedObjectContext, childThread: Bool) { 
    if context.hasChanges { 

     do { 
      try context.save() 
      print("saved on mainThread: \(!childThread)!") 
     } catch { 
      //... 
     } 

     if context.parentContext != nil { // private context 
      dispatch_async(dispatch_get_main_queue(), { 
       print("preparing to save main context") 
       self.saveContext(context.parentContext!, childThread: false) 
      }) 
     } 
    } else { 
     print("no changes seen") 
    } 
} 

Mit anderen Worten, nachdem ich erfolgreich auf dem Kind Kontext speichern, meine saveContext Methode bereitet den Kontext auf dem Hauptthread zu sparen, nur etwa 50% der Zeit, scheitern und „keine Änderungen auszudrucken gesehen."

Wird context.save() asynchron ausgeführt? Muss ich etwas wie eine kontextgespeicherte Benachrichtigung verwenden? (Ich dachte, das wäre für die Eltern-Kind-Einrichtung nicht notwendig.)

Antwort

0

Sie sollten performBlock/performBlockAndWait verwenden, um Vorgänge in Kontexten auszuführen.

+0

Dies geschieht vor dem Aufruf von saveContext. – anders32