NSManagedObjectContext es el contenedor en memoria de su gráfico de objetos de aplicaciones, del mismo modo que el almacén persistente (XML, SQLite, etc.) generalmente representa el contenedor en disco de su gráfico de objetos.
Hay algunas ventajas de este enfoque:
- Faulting se puede aplicar a un conjunto de objetos, o en el caso de CoreData todo el gráfico de objetos
- Es una abstracción conveniente para forzar la aplicación a lote es E/S.
- Proporciona un único punto de contacto para realizar operaciones de manera eficiente en todo el gráfico de objetos (NSFetchRequests, etc.)
- Deshacer puede aplicarse al gráfico de objetos, no solo a objetos individuales.
También es importante recordar que CoreData no es un marco ORM, es un marco de persistencia de objetos. La principal responsabilidad de CoreData es hacer que el acceso a los datos almacenados en un formato persistente en el disco sea más eficiente. Sin embargo, no intenta emular la funcionalidad de las bases de datos relacionales.
A su punto de concurrencia, se han presentado nuevos modelos de simultaneidad en la próxima versión de Mac OSX. Puede leer más sobre eso en developer.apple.com.
Sin embargo, en abstracto, el modelo de concurrencia elegido para un contexto de objeto gestionado tiene más que ver con los detalles de una aplicación individual que con el propio patrón de contexto. Las instancias de NSManagedObjectContext generalmente nunca deben compartirse entre subprocesos.
De la misma manera que cada subproceso requiere su propia instancia de NSAutoReleasePool, cada subproceso también debe tener su propio MOC. De esta forma, cuando el hilo se ejecuta, puede confirmar sus cambios en la tienda en el disco y luego liberar el contexto, liberando toda la memoria consumida por los objetos procesados en el hilo.
Este es un paradigma mucho más eficiente que permitir que un único contexto consuma continuamente recursos del sistema durante el ciclo de vida de una aplicación determinada.Por supuesto, esto se puede hacer invocando -reset on the context también, lo que hará que todos los NSManagedObject's en uso por el contexto sean devueltos a fallas.
+1 para una buena pregunta. Sé que un contexto grande a menudo se ve como un antipatrón pero no me parece que Apple esté abusando de él de una manera como, por ejemplo, un programador junior que pasa las tejas del techo solo para sumergir el inodoro del baño. 'NSManagedObjectContext' administra muchas cosas pero a través de métodos y no requiere que todas sus entidades estén disponibles a la vez o que dos entidades que comparten el mismo modelo se conozcan entre sí. – Joe