CoreData
Entität "A" hat eine Eins-zu-Viele-Beziehung zu einer Sammlung von CoreData
Einträgen "B" unter Verwendung einer Kaskadenlöschregel.
iCloud
Während in einer Umgebung Gerät 1 eine Detailansicht eines der Einträge "B" zeigt, löscht Gerät 2 den Eintrag "A".
Wenn die NSPersistentStoreDidImportUbiquitousContentChangesNotification
Benachrichtigung in Gerät 1 empfangen wird, ruft der App-Delegierte an mergeChangesFromContextDidSaveNotification
und sendet dann eine interne Benachrichtigung, die vom Ansichtscontroller erfasst wird und die Details des Eintrags "B" enthält (der Code verwendet, performBlock
wo er sollte).
Obwohl der Eintrag "A" tatsächlich ungültig wird, wenn der Detailansichts-Controller die interne Benachrichtigung empfängt, ist der Eintrag "B" weiterhin als gültiges CoreData
Objekt vorhanden. Es scheint, dass die Cascade-Regel ihren Betrieb noch nicht abgeschlossen hat. Daher ist dem View Controller in Gerät 1 das Löschen nicht bekannt, was zu unerwarteten Ergebnissen führen kann.
mergeChangesFromContextDidSaveNotification
scheint vorzeitig zurückzukehren, wenn die Basisdaten zusammengeführt wurden, die Cascade-Regel jedoch noch nicht abgeschlossen ist.
Ich habe versucht, den Eintrag "B" zu aktualisieren, wenn die Benachrichtigung eintrifft, während der stalenessInterval
Kontext des verwalteten Objekts vorübergehend auf Null gesetzt wurde, damit kein zwischengespeichertes Objekt verwendet wird. Ich erhalte jedoch weiterhin einen gültigen Eintrag "B" aus dem Geschäft.
Das Überprüfen auf einen null
Eintrag "A" an dieser Stelle ist keine Option, da die Situation etwas komplexer ist als die hier beschriebene und ein Nulleintrag "A" in einigen Fällen gültig sein kann.
Ich habe versucht, nach dem Zusammenführen der Änderungen und vor dem Senden der internen Benachrichtigung an die View Controller eine Verzögerung einzuführen. Ich fand heraus, dass eine Verzögerung von 2 Sekunden nicht hilft, aber eine Verzögerung von 10 Sekunden funktioniert.
Aber ich möchte mich nicht auf diese Verzögerung verlassen. Dies ist eine Testumgebung ohne viele Daten, und ich weiß nicht, was in einer Produktionsumgebung passieren wird. Sich auf eine experimentelle Verzögerung zu verlassen, scheint nicht das Richtige zu sein.
Gibt es eine richtige Sache? Oder mache ich zuerst etwas falsch?