Ich kämpfe seit einiger Zeit damit und Apples Dokumentation und SO haben bisher nicht geholfen. Ich habe ManagedObjectContext in einem UIManagedDocument verwendet und der folgende Code funktionierte einwandfrei. Ich entschied mich dann, Apples Vorlage für CoreData in AppDelegate zu verwenden, sodass Model, persistenter Store-Koordinator und Kontext in AppDelegate erstellt wurden. Das Abrufen mit dem Kontext von AppDelegate ist kein Problem, aber das Speichern im Hintergrund ist ein Problem. Ich sollte lokalen Kontext auf dem Thread haben, den ich spare und wie pro Apple, um den gleichen Persistance Store Coordinator zu haben. Der folgende Code speichert die Daten jedoch nicht. Kann hier jemand bitte beraten? Danke.
%Vor%Versuchen Sie, übergeordnete / untergeordnete Kontexte zu verwenden:
Im obigen Link finden Sie ein Codebeispiel.
Ihr Absturz tritt auf, weil Ihr NSManagedObjectContext
das ältere verwendet veraltetes Threading-Confinement-Modell für Core Data Concurrency :
secureManagedObjectContext = [[NSManagedObjectContext alloc] init];
init
ist nur ein Wrapper um initWithConcurrencyType:
mit dem Argument NSConfinementConcurrencyType
. Dies erstellt den Kontext mithilfe des Thread-Confinement-Modells, das performBlock:
oder performBlockAndWait:
nicht verwenden kann. Nur Kontexte, die das neuere (nicht veraltete!) Warteschlangeneingrenzungsmodell verwenden, können diese Methoden verwenden und müssen diese Methoden für jeden Zugriff auf den Kontext oder die zugehörigen Objekte verwenden. So erstellen Sie einen Kontext mithilfe der Warteschlangenbeschränkung und einer privaten Warteschlange:
secureManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
Wenn Ihr Code zur Verwendung eines privaten Warteschlangenkontexts migriert wurde, können Sie auch Ihre serielle Dispatch-Warteschlange entfernen, da der private Warteschlangenkontext eine äquivalente Funktionalität bietet.
Tags und Links objective-c multithreading ios core-data