2009-09-21 3 views
14

In Apples Core Data-Dokumentation für , listet sie die bevorzugte Methode für Thread-Sicherheit als separate NSManagedObjectContext pro Thread, mit einem gemeinsamen NSPersistentStoreCoordinator.Multithread-Verwendung von Core Data (NSOperationQueue und NSManagedObjectContext)

Wenn ich eine Reihe von NSOperationen nacheinander auf einer NSOperationQueue ausführen, gibt es einen großen Overhead, der den Kontext für jede Aufgabe erstellt?

Mit der NSOperationQueue, die eine maximale Anzahl gleichzeitiger Operationen von 1 aufweist, verwenden viele meiner Operationen denselben Thread. Kann ich das Thread-Wörterbuch verwenden, um einen NSManagedObjectContext pro Thread zu erstellen? Wenn ich das tue, werde ich später Probleme haben, meine Kontexte zu bereinigen?

Wie kann Core Data in diesem Fall richtig verwendet werden?

Antwort

19

Der richtige Weg Core Data in diesem Fall zu verwenden ist, ein separates NSManagedObjectContext pro Betrieb oder zu erstellen einen einzelnen Kontext zu haben, die Sie (über -[NSManagedObjectContext lock] vor dem Gebrauch und -[NSManagedObjectContext unlock] nach Gebrauch) sperren. Der gesperrte Ansatz kann sinnvoll sein, wenn die Operationen seriell sind und keine anderen Threads den Kontext verwenden.

Welcher Ansatz verwendet wird, ist eine empirische Frage, die ohne Daten nicht beantwortet werden kann. Es gibt zu viele Variablen, um eine allgemeine Regel zu haben. Harte Zahlen aus Leistungstests sind die einzige Möglichkeit, eine fundierte Entscheidung zu treffen.

+1

FYI - 'lock' und' unlock' sind in iOS8 und OSX 10.10 veraltet. Die Empfehlung lautet: "Verwenden Sie einen Warteschlangenstilkontext und -performBlockAndWait: stattdessen" –

2

Operationen, die mit NSOperationQueue mit einer maximalen Anzahl gleichzeitiger Operationen von 1 gestartet wurden, führen nicht alle Operationen für denselben Thread aus. Die Operationen werden nacheinander ausgeführt, aber jedes Mal wird ein neuer Thread erstellt.

Das Erstellen von Objekten im Thread-Wörterbuch ist daher wenig hilfreich.

+2

Es gibt keine Garantie, dass es jedes Mal ein neuer Thread wird. Bei Snow Leopard verwendet NSOperationQueue Grand Central Dispatch, das explizit Threads wiederverwendet. –

+0

Bei dieser Frage geht es um das iPhone, nicht um Snow Leopard. Und natürlich gibt es keine ** Garantie **, gibt es jemals? –

2

Während diese Frage alt ist, steht sie tatsächlich ganz oben in den Suchergebnissen von Google zu 'NSMangedObjectContext threading', also werde ich einfach eine neue Antwort einfügen.

Die neue 'bevorzugte' Methode besteht darin, den initWithConcurrencyType zu verwenden: und dem MOC mitzuteilen, ob es sich um einen Haupt-Thread-MOC oder einen sekundären Thread-Moc handelt. Sie können dann die neuen Methoden performBlock: und performBlockAndWait: verwenden und der MOC kümmert sich um die Serialisierung von Operationen auf seinem "nativen" Thread.

Das Problem wird dann, wie Sie intelligent die Daten zwischen den verschiedenen MOCs zusammenführen, die Ihre Anwendung hervorbringen kann, zusammen mit tausend anderen Details, die das Leben als Programmierer 'Spaß' machen.