In CoreData-Kontext im Hintergrund-Thread speichern

8

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%     
Martin Koles 15.09.2013, 12:00
quelle

2 Antworten

17

Versuchen Sie, übergeordnete / untergeordnete Kontexte zu verwenden:

Zypern

Im obigen Link finden Sie ein Codebeispiel.

    
Sviatoslav Yakymiv 15.09.2013, 13:35
quelle
3

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.

    
quellish 14.09.2014 02:05
quelle