Merkwürdiges Verhalten bei Verwendung von untergeordnetem / übergeordnetem NSManagedObjectContext

Ich entwickle eine Anwendung, in der ich sowohl Dinge berechnen (Operationen in mehreren Sekunden) als auch Dinge auf einen Hintergrund-Thread schreiben (Daten mit einem Server synchronisieren) muss.

Aus diesem Grund verwende ich zwei NSManagedObjectContexts (MOC), ein untergeordnetes und ein übergeordnetes Element, und diese müssen immer synchron sein. Um sicherzustellen, dass sie synchron sind, bearbeite ich immer Daten zum untergeordneten MOC / füge sie hinzu, damit sie mit dem folgenden Muster zum Haupt-MOC übertragen werden:

[childMOC performBlock:^{

    MyObject *myObject = *create new object in childMOC*

    [childMOC save:&error];

    [mainMOC performBlock:^{
        [mainMOC save:&error];
        // Is this mandatory to make it work correctly?
        // [childMOC performBlock:^{
        //     [childMOC refreshObject:myObject mergeChanges:NO];
        // }];
    }];
}];

Nach einer Weile schien es, als hätte ich zwei Versionen desselben Objekts im Hintergrund, eine mit einer temporären ID und eine mit einer permanenten ID. Wenn ich z. Untergeordnete Objekte wurden zum "echten" Objekt hinzugefügt (indem eine neue permanente ID vom Haupt-MOC an das untergeordnete MOC übergeben wurde). Diese Objekte wurden beim Abrufen des Objekts im Hintergrund-MOC nicht angezeigt, da es sich um das alte temporäre Objekt handelt, das zwischengespeichert wird.

Ich habe gesehen, dass das obige Muster häufig verwendet wurde, aber es scheint seltsam, dass niemand dieses temporäre / permanente ID-Problem erwähnt hat.

Es fühlt sich nicht richtig an, dass es sich innerhalb eines Kontexts um zwei Versionen desselben Objekts handeln kann. Wenn ich eine NSManagedObjectID an das untergeordnete MOC übergebe und diese abrufe, sollte das untergeordnete MOC dann nicht mein vorhandenes Objekt aktualisieren, anstatt ein neues zu erstellen und mein altes temporäres Objekt als zwischengespeicherten Standardwert zu belassen?

Muss ich die kommentierte Zeile an jeder Stelle verwenden, an der ich ein Objekt erstelle?

Oder funktioniert es mit mergeChangesFromContextDidSaveNotification, wird das den gleichen Effekt haben?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage