Grundsätzlich habe ich nur einen Moc in meiner App verwendet, aber ich denke, dass ich in einigen Fällen mehrere NSManagedObjectContext verwenden sollte.
Normalerweise möchten Sie für jeden Thread, der auf die Core Data-Datenbank zugreifen wird, ein separates NSManagedObjectContext
verwenden. Dadurch wird verhindert, dass die Objektdiagramme aufgrund gleichzeitiger Schreibvorgänge im selben Kontext möglicherweise in einen inkonsistenten Zustand geraten.
Der einfachste Weg, dies zu umgehen, besteht darin, für jeden Thread ein neues NSManagedObjectContext
zu erstellen und ein einzelnes NSPersistentStoreCoordinator
zu teilen.
Erstellen Sie eine Eigenschaft in Ihrem AppDelegate vom Typ NSManagedObjectContext
und überschreiben Sie den Getter, um für jeden aufrufenden Thread einen neuen Kontext zurückzugeben. Tun Sie dies, indem Sie den threadDictionary
jedes Threads verwenden.
Richten Sie zuerst Ihr managedObjectModel und Ihren persistentenStoreCoordinator wie gewohnt ein. Dann erstellen Sie Ihren Kontext in Ihrem AppDelegate und weisen Sie Ihrer Eigenschaft Folgendes zu:
%Vor%Verwenden Sie in Ihrer managedObjectContext-Getter-Überschreibung den folgenden Code, um für jeden aufrufenden Thread einen separaten Kontext zurückzugeben:
%Vor%Jetzt, wo auch immer in Ihrem Code Sie auf die Eigenschaft managedObjectContext von AppDelegate zugreifen, sind Sie sicher, threadsicher zu sein.
Der folgende Link erklärt deutlich, wann, warum und wie der Kontext für mehrere verwaltete Objekte verwendet wird.
Im Folgenden werden zwei Hauptgründe für die Verwendung von mehreren verwalteten Objektkontexten aufgeführt.
NSManagedObjectContext
threadsicher zu machen, weil NSManagedObjectContext
nicht threadsicher ist. NSManagedObjectContext
, um Daten auf der Benutzeroberfläche anzuzeigen. Das bedeutet, dass beim Abrufen von Daten auf der Benutzeroberfläche und beim Abrufen von Daten vom Server Daten für untergeordnete NSManagedObjectContext
abgerufen werden sollten, um Probleme mit Parallelität und Blockierung der Benutzeroberfläche zu vermeiden.