ios - strong - variable lazy
Swift-¿es lazy var var thread-safe? (1)
Tal vez esta pregunta requiera un poco de contexto.
He estado trabajando en mi capa de persistencia utilizando Core Data y descubrí que Core Data no es seguro para subprocesos y, por lo tanto, requiere que NSManagedObjectContext
esté confinado a cada subproceso solo.
Así que mi enfoque es crear un subproceso de fondo personalizado NSManagedObjectContext
que ejecuta la búsqueda, el guardado, etc., y también para crear el subproceso principal NSManagedObjectContext
que se utilizará para obtener NSManagedObject
de NSManagedObjectId
y pasarlo al método de llamador.
De forma predeterminada, Xcode genera un código de plantilla relacionado con los datos principales utilizando lazy var
para todos los NSManagedObjectContext
, NSManagedObjectModel
, etc.
Entonces mi pregunta es si
utilice el enfoque de creación de instancias de lazy var
para crear NSManagedObjectContext
, siempre que lazy var
inicie un objeto para cada subproceso que intente acceder (¿no es seguro para subprocesos?)
o
declare las variables separadas para NSManagedObjectContext
en cada subproceso y haga que todos los métodos relacionados con subprocesos hagan referencia a dos NSManagedObjectContext
diferentes siempre que lazy var
sea seguro para subprocesos (?) y se cree solo una vez cuando se acceda sin importar el subproceso.
¡Gracias de antemano!
editar: Cualquiera que esté luchando con el problema de concurrencia de Data Core, este artículo presenta un patrón de diseño muy agradable para trabajar, como lo señala Aaron en el comentario a continuación.
lazy var
no es segura para subprocesos. Puede usar dispatch_once
, una constante ( let
) o el patrón de estructura anidado (generalmente utilizado para singletons) para seguridad de subprocesos. También puede emplear su propio bloqueo utilizando NSRecursiveLock
pero probablemente no sea tan eficiente como dispatch_once
.