NSOperation VS GCD para Core-Data

¿Qué es más adecuado para una situación en la que los datos deben almacenarse en Core-Data en un hilo y leer de Core-Data en otro?

Estaba pensando en GCD pero ¿cómo funciona con la creación de NSManagedObjectContext para cada subprocess? ¿Cómo se crean estos objects en una queue?

El almacén de datos debe actualizarse / sincronizarse cuando se han realizado cambios en varios subprocesss, ¿es mejor hacerlo con GCD o NSOperation?

Me gustaría poder pasar bloques a las 2 queues al leer y escribir en el almacén de datos según sea necesario, sin tener problemas para corromper la tienda o tener diferentes versiones de la tienda.

El debate entre GCD y NSOperation básicamente se networkinguce al argumento de utilizar el más alto nivel de abstracción que le proporciona una buena solución.

NSOperationQueue está construido sobre GCD, por lo que debe ser un nivel más alto de abstracción.

Sin embargo, el GCD es tan fácil de usar en el caso general, que me parece que es preferible a NSOperationQueue en muchos casos.

Ahora, cuando traes CoreData a la mezcla, sugiero una tercera alternativa. Si está utilizando iOS 5, puede usar la simultaneidad de queue privada con su MOC. Me parece que es una buena abstracción, y proporciona una interfaz fácil de usar.

Por lo tanto, sugiero que simplemente cree un MOC con NSPrivateQueueConcurrencyType para cada subprocess en el que desea hacer Core Data. Puede elegir, de acuerdo con las características de su aplicación, si comparte un persistentStoreCoordinator o si usa uno separado. Incluso podría utilizar contexts nesteds (con una advertencia para el lado de inserción).

Básicamente, sigue este model …

 NSManagedObjectContext *moc = [[NSManagedObjectCotext alloc] initWithConcurrencyType:NSPrivateQueuqConcurrencyType]; moc.parentContext = contextIWantToBeParent; moc.persistentStoreCoordinator = pscIWant; [moc performBlock:^{ // Your MOC stuff running on its own private queue }]; 

Por supuesto, debe elegir un método (ya sea un padre o madre con un MOC existente o unirlo a un PSC).

Generalmente prefiero el método performBlock .

EDITAR

Gracias. Leí que NSManagedObject no es seguro para subprocesss. ¿Cómo crearía nuevos NSManagedObjects en esa queue privada? – Helium3

Si eso es verdad. Sin embargo, cuando crea un MOC con un tipo de concurrency, está aceptando un contrato que se parece a esto.

Yo, un progtwigdor astuto, acepto solemnemente las siguientes Reglas de datos básicos con respecto a la simultaneidad:

  1. Si utilizo NSConfinementConcurrencyType , solo lo NSConfinementConcurrencyType mientras se ejecuta en el subprocess que lo creó.

  2. Si utilizo NSPrivateQueueConcurrencyType , solo NSPrivateQueueConcurrencyType el MOC desde dentro de performBlock o performBlockAndWait .

  3. Si utilizo NSMainQueueConcurrencyType , solo NSMainQueueConcurrencyType el MOC desde dentro de performBlock , performBlockAndWait , o cuando sepa que estoy ejecutando en el hilo principal.

Si sigues esas reglas, podrás usar el MOC en otros subprocesss.

Específicamente, al usar performBlock , Core Data API se asegurará de que el código esté sincronizado apropiadamente.