7

Estoy aprendiendo sobre CoreData. Obviamente, una de las clases principales que entouer es NSManagedObjectContext. No tengo claro el papel exacto de esto. De los artículos que leí, parece que puede tener múltiples NSManagedObjectContexts. ¿Esto significa que NSManagedObjectContext es básicamente una copia del back-end?NSManagedObjectContext confusion

¿Cómo se resolvería esto en un backend consistente cuando haya múltiples copias diferentes por ahí?

Así que, básicamente, 2 preguntas:

Es NSManagedContext una copia de la base de datos back-end?

y ...

Por ejemplo, digamos que hago un cambio en el contexto A y hacer algún otro cambio en el contexto B. Entonces me llama ahorrar en un principio, luego B? prevalecerá B?

Gracias

Respuesta

11

El NSManagedObjectContext no es una copia de la base de datos back-end. El documentation lo describe como un bloc de notas

Una instancia de NSManagedObjectContext representa un único “objeto espacio” o bloc de notas en una aplicación. Su principal responsabilidad es para administrar una colección de objetos administrados. Estos objetos forman un grupo de objetos modelo relacionados que representan una vista internamente consistente de uno o más almacenes persistentes. Existe una única instancia de objeto gestionado en un único contexto, pero pueden existir múltiples copias de un objeto en diferentes contextos. Por lo tanto, la uniquing de objetos tiene un contexto particular de .

El NSManagedObjectContext es solo un lugar temporal para realizar cambios en los objetos gestionados de forma transaccional. Cuando realiza cambios en objetos en un contexto, no afecta a la base de datos back-end hasta que guarde el contexto y, como usted sabe, puede tener múltiples contextos en los que puede realizar cambios, lo cual es realmente importante para concurrency.

Para la pregunta número 2, la respuesta para quién prevalecerá dependerá del merge policy que establezca para su contexto y cuál se llama último, que sería B. Aquí están las políticas de fusión que se pueden establecer que afectarán el segundo contexto Ser salvado.

NSErrorMergePolicyType
Especifica una política que hace que una mano salvadora fallar si los hay conflictos de fusión.

NSMergeByPropertyStoreTrumpMergePolicyType
Especifica una política que fusiona los conflictos entre la versión del almacén persistente del objeto y la versión actual en memoria, dando prioridad a cambios externos.

NSMergeByPropertyObjectTrumpMergePolicyType
Especifica una política que combina los conflictos entre la versión del almacén persistente del objeto y la versión actual en memoria, dando prioridad a cambios en memoria.

NSOverwriteMergePolicyType
Especifica una política que sobrescribe el estado en el almacenamiento persistente de los objetos modificados en conflicto.

NSRollbackMergePolicyType
Especifica una política que descarta los cambios de estado en memoria de los objetos en conflicto.

+0

"concurrencia". el enlace ha expirado –

+0

@ Mr.UB Resuelto, gracias. – Joe

2

Un NSManagedObjectContext es una representación específica de su modelo de datos. Cada contexto mantiene su propio estado (por ejemplo, contexto) por lo que los cambios en un contexto no afectarán directamente a otros contextos. Cuando trabajas con contextos múltiples, es tu responsabilidad mantenerlos consistentes al fusionar los cambios cuando un contexto guarda sus cambios en la tienda.

Su pregunta está relacionada con este proceso y también puede implicar conflictos de combinación. Cada vez que guarda un contexto, sus cambios se confirman en la tienda y se usa una política de fusión para resolver conflictos.

Al guardar un contexto, se publicarán varias notificaciones sobre el progreso. En su caso, si [contextA save:&error] tiene éxito, el contexto publicará la notificación NSManagedObjectContextDidSaveNotification. Cuando haya varios contextos, por lo general observar esta notificación y llamar:

[contextB mergeChangesFromContextDidSaveNotification:notification]; 

Esto combinar los cambios guardados en contextA en contextB.

EDIT: eliminó el comentario 'thread-safe'. NSManagedObjectContext no es seguro para subprocesos.