¿Patrón de context? ¿Por qué Core Data lo necesita?

Todavía soy bastante nuevo en Core Data y estoy tratando de comprender por qué requiere el paso de un NSManagedObjectContext. Según lo entiendo, se necesita pasar el context para que varios subprocesss no afecten el mismo context, pero también tuve la printing de que este patrón a veces se considera un antipatrón, como se señala aquí .

¿Se podrían implementar datos básicos teóricamente de una manera segura para evitar el uso de este patrón? ¿Cómo evitan este patrón otros ORM (como el ActiveRecord de Ruby, por ejemplo)? Por ejemplo, CoreData no podría implementar un método de guardado por NSManagedObject como en esta extensión . Este framework liviano no maneja multiprocess, pero ¿no podría NSManagedObjects utilizar algún tipo de queue (s) GCD internas para soportarlo, con un context interno que no exponen?

Lo siento si me falta algo importante.

NSManagedObjectContext es el contenedor en memory de su gráfico de objects de aplicaciones, al igual que el almacén persistente (XML, SQLite, etc.) generalmente representa el contenedor en disco del gráfico de objects.

Este enfoque ofrece algunas ventajas:

  1. El error se puede aplicar a un set de objects, o en el caso de CoreData, el gráfico de object completo
  2. Es una abstracción conveniente para obligar a la aplicación a su I / O por lotes.
  3. Proporciona un único punto de contacto para realizar operaciones de manera eficiente en todo el gráfico de objects (NSFetchRequests, etc.)
  4. Se puede aplicar Deshacer al gráfico del object, no solo a los objects individuales.

También es importante recordar que CoreData no es un marco ORM, es un marco de persistencia de objects. La principal responsabilidad de CoreData es hacer que el acceso a los datos almacenados en un formatting persistente en el disco sea más eficiente. Sin embargo, no intenta emular la funcionalidad de las bases de datos relacionales.

A su punto sobre concurrency, se han introducido nuevos models de concurrency en la próxima versión de Mac OSX. Puede leer más sobre eso en developer.apple.com.

Sin embargo, en resumen, el model de concurrency elegido para un context de object gestionado tiene más que ver con los detalles de una aplicación individual que con el propio patrón de context. Por lo general, las instancias de NSManagedObjectContext nunca se deben compartir entre subprocesss.

De la misma manera que cada subprocess requiere su propia instancia de NSAutoReleasePool, cada subprocess también debe tener su propio MOC. De esta forma, cuando el hilo esté terminado de ejecutarse, puede comprometer sus cambios en la tienda en el disco y luego liberar el context, liberando toda la memory consumida por los objects procesados ​​en el hilo.

Este es un paradigma mucho más eficiente que permitir que un context único consum resources del sistema continuamente durante el ciclo de vida de una aplicación determinada. Por supuesto, esto se puede hacer invocando -reset en el context también, lo que hará que todos los NSManagedObject's en uso por el context sean devueltos a fallas.

Necesita un NSManagedObjectContext por subprocess. Así que tendría uno para completar su interfaz de usuario en el hilo principal y, para operaciones más largas, tendría otro para cada hilo de background. Si desea que los resultados se fusionen desde esos otros hilos, entonces hay una notificación a la que puede suscribirse que proporciona algo para combinar rápidamente lo que se cambió a su MOC principal.