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!
Danke für Ihre Antwort. Bedeutet das, dass 'lazy var' verschiedene Instanzen für verschiedene Threads erstellt, die versuchen, auf ihren Wert zuzugreifen? –
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. –
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. –