'Der persistente Speicher des Objekts ist nicht erreichbar ...' im Haupt-Thread

7

Ich bin einer der vielen, die folgenden Kerndatenfehler bekommen ( 133000 ):

%Vor%

Wie ich schon bei SO gesehen habe, liegt das an den Threading-Beschränkungen von Core Data.
Allerdings habe ich alle korrekten Threading-Einschränkungen eingehalten, und dennoch tritt dieser Fehler immer noch auf.

Ich erstelle ein NSManagedObject mit dem folgenden Code, um die Funktion im Hauptthread auszuführen:

%Vor%

Diese Funktion erstellt dann das Objekt und es ist vollkommen glücklich.
Wenn Sie dann versuchen, das Objekt mit [objectContext existingObjectWithID:objectID error:&error] abzurufen, wird nil mit dem oben genannten Fehler zurückgegeben.

Ich habe auch das Objekt, das mit einem @synchonisierten Mutex-Sperrblock abgeholt wird, für alle Fälle eingeschlossen, und trotzdem kann es das Objekt nicht abrufen.

Es scheint, dass das Speichern des Kontexts vor der Hand das behebt, jedoch möchte ich das Objekt unabhängig davon abrufen, ob es gespeichert ist oder nicht, da die DB zu diesem Zeitpunkt nicht gespeichert werden sollte.

    
Tim 21.08.2012, 07:43
quelle

4 Antworten

11

Die Antwort gefunden.
Das Problem war nichts mit Threading zu tun. Es war einfach so, weil bereits ein Schreibvorgang stattfand (also warum Leute über Ockhams Rasiermesser annehmen, dass es ein Threading-Problem ist).

Der wirkliche Grund, warum dieser Fehler auftritt, ist nicht das Threading, wie es im Internet steht, sondern weil ein Lese- / Schreibvorgang zur selben Zeit läuft, an dem Sie ein anderes Lesen / Schreiben versuchen.

[objectContext existingObjectWithID:objectID error:&error] führt I / O in der Datenbank durch, um zu garantieren, dass das Objekt, das Sie zurück erhalten, tatsächlich existiert. Allerdings , in meinem Fall habe ich bereits einen gelesen, der höher im Stapel liegt .

Es wurde versucht, die Kinder der Eltern zu lesen und dann jedes Kind zu lesen. Eigentlich sollte ich [objectContext objectWithID:objectID] verwenden, um ein fehlerhaftes -Objekt abzurufen und dann die entsprechenden I / O-Vorgänge auszuführen, sobald dies erforderlich ist.

Dies ist nicht nur der richtige Weg, um Dinge zu tun, es spart auch Speicher, indem nicht fünfzig Milliarden Kind-Entitäten geladen werden, wenn Sie nur die Liste von ihnen wollen.

Hoffe, dass hilft, Dinge für jemanden zu klären!

    
Tim 22.08.2012, 06:19
quelle
5

Ich möchte meinen Fall teilen, der mit NSManagedObjectContextDidSaveNotification zusammenhängt:

Ich hatte dieses Problem nur in meinem UnitTests-Ziel, in den Testfällen, die eine Interaktion mit dem Core-Data-Stack beinhalteten.

In meiner Konfiguration des Unit-Testziels wird jedem Fall zuvor beforeEach block mit cleanUnitTestsDatabase() macros vorangestellt. Dadurch wird die .sqlite3-Datei von Core Data entfernt und ein Kontext für verwaltete Objekte und ein persistenter Store-Koordinator werden wieder in einen neuen Zustand versetzt , so habe ich jedes Mal, wenn ich in einem neuen / nächsten Testfall laufe, eine ganze Datenbank in einem sauberen Zustand.

Dies verursachte das Problem, weil manchmal die folgende Methode aufgerufen wurde, nachdem die aktuelle Datenbank gelöscht wurde, weil der aktuelle Testfall bereits bestanden wurde und der nächste folgende Testfall bereits eingegeben wurde:

%Vor%     
Stanislav Pankevich 22.09.2013 12:57
quelle
2

Ich wollte ein Beispiel für dieses Problem von zwei Lesevorgängen des NSManagedObject zeigen, die zusammenstoßen und die Fehlermeldung in der Originalfrage erzeugen. Dies geschieht jedoch nur, wenn Sie die NSManagedObjectContextDidSaveNotification eingerichtet haben und eine mergeChangesFromContextDidSaveNotification ausführen ... Interessanterweise wurde diese Benachrichtigung ausgelöst, als ein Wert fürForKey gelesen wurde ... nicht sicher, ob dort ein Problem vorliegt.

%Vor%

und wie ich es gelöst habe: 0)

%Vor%

In jedem Fall, fügen Sie einen NSLog ein und finden Sie so viele Saves wie möglich, weil Sie wahrscheinlich nicht so viele Saves oder Reads brauchen und versuchen, alles in einen Read oder einen Write zu bekommen.

>     
hokkuk 13.03.2013 21:52
quelle
1

Ich bekam den gleichen Fehler, obwohl mein Problem etwas anders war. Ich hatte mehrere NSManagedObjectContext s mit verschiedenen NSPersistentStoreCoordinator s (eine 3rd-Party-Bibliothek). Sie hatten Konflikte, als die NSManagedObjectContextDidSaveNotification -Benachrichtigung stattfand. Das heißt, Sie melden eines der NSManagedObjectContext s von Änderungen, von denen es nichts weiß. Das ist, was "Persistant-Speicher des Objekts ist nicht erreichbar von diesem NSManagedObjectContext-Koordinator" mit anderen Worten sagte:)

    
Homero Barbosa 23.01.2013 21:25
quelle

Tags und Links