2015-04-21 13 views
5

Vielleicht erfordert diese Frage ein wenig Kontext.Swift - ist faul var thread-safe?

Ich habe an meiner Persistenzschicht mit Core Data gearbeitet und herausgefunden, dass Core Data nicht threadsicher ist und somit NSManagedObjectContext auf jeden einzelnen Thread beschränkt werden muss.

So ist mein Ansatz kundenspezifische Hintergrund-Thread NSManagedObjectContext zu schaffen, die, Speicher etc. fetching ausführt, während auch Hauptthread NSManagedObjectContext zu erstellen, die verwendet werden NSManagedObject von geholt NSManagedObjectId zu erhalten und weitergeben Methode an Anrufern.

generiert standardmäßig Xcode Template-Code im Zusammenhang mit Core Data mit lazy var für alle NSManagedObjectContext, NSManagedObjectModel usw.

Also meine Frage ist, ob

den Ansatz lazy var Instanziierung verwenden NSManagedObjectContext zur Erstellung, dass lazy var vorgesehen initiiert ein Objekt für jeden Thread versucht, den Zugang (nicht threadsicher?)

oder

Deklarieren Sie in jedem Thread separate Variablen für NSManagedObjectContext, und führen Sie alle threadbezogenen Methoden so aus, dass sie zwei verschiedene NSManagedObjectContext referenzieren, vorausgesetzt, dass lazy var threadsicher (?) Ist und nur einmal erstellt wird, wenn auf sie unabhängig vom Thread zugegriffen wird.

Vielen Dank im Voraus!

bearbeiten: Jeder, der mit Core Data Concurrency Problem, this article zu kämpfen hat, legt ein sehr schönes Design-Muster, um mit zu arbeiten, wie von Aaron im Kommentar unten hingewiesen!

Antwort

11

lazy var ist nicht threadsicher. Sie können dispatch_once, eine Konstante (let) oder das verschachtelte Strukturmuster (normalerweise für Singletons verwendet) für die Thread-Sicherheit verwenden. Sie könnten auch Ihr eigenes Sperren mit NSRecursiveLock verwenden, aber das ist wahrscheinlich nicht so effizient wie dispatch_once.

+0

Danke für Ihre Antwort. Bedeutet das, dass 'lazy var' verschiedene Instanzen für verschiedene Threads erstellt, die versuchen, auf ihren Wert zuzugreifen? –

+0

Nein, das bedeutet, wenn zwei Threads gleichzeitig versuchen, darauf zuzugreifen, kann der zweite Thread ein teilweise initialisiertes Objekt erhalten. Und da 'NSManagedObjectContext' nicht Thread-sicher ist, sollten Sie nicht von verschiedenen Threads darauf zugreifen. –

+0

Okay. Also sollte ich für jeden Thread, den ich verwenden möchte, eine andere Instanz von 'NSManagedObjectContext' deklarieren und Methoden erzwingen, die im Hintergrundthread ausgeführt werden, um nur auf' NSManagedObjectContext' zuzugreifen, der zuvor im gleichen Hintergrundthread erstellt wurde? Vielen Dank. –