Actualmente [mayo de 2015] Apple Concurrency with Core Data documentation es, en el mejor de los casos, muy engañoso, ya que no cubre ninguna de las mejoras en iOS 5 y, por lo tanto, ya no muestra las mejores formas de utilizar datos centrales al mismo tiempo.Hay dos cambios muy importantes en iOS 5: contextos principales y nuevos tipos de concurrencia/subprocesamiento.
No he encontrado ninguna documentación escrita que cubra exhaustivamente estas nuevas características, pero el WWDC 2012 video "Session 214 - Core Data Best Practices" lo explica muy bien.
Magical Record utiliza estas nuevas características y puede valer la pena echarle un vistazo.
Los conceptos básicos reales siguen siendo los mismos: solo puede usar objetos administrados en el subproceso en el que se creó el contexto de objetos administrados.
Ahora puede usar [moc performBlock:] para ejecutar el código en el subproceso derecho.
No hay necesidad de utilizar mergeChangesFromContextDidSaveNotification: más; en su lugar, cree un contexto secundario para realizar los cambios, luego guarde el contexto secundario. Al guardar el contexto secundario, los cambios se incluirán automáticamente en el contexto principal, y para guardar los cambios en el disco solo se realizará un guardado en el contexto principal en su cadena de caracteres.
Para que esto funcione, debe crear el contexto padre con un tipo concurrente, por ejemplo:
mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
Luego, en el subproceso de fondo:
context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[context setParentContext:mainManagedObjectContext];
<... perform actions on context ...>
NSError *error;
if (![context save:&error])
{
<... handle error ...>
}
[mainManagedObjectContext performBlock:^{
NSError *e = nil;
if (![mainContext save:&e])
{
<... handle error ...>
}
}];
he encontrado un gran ejemplo de la fusión de contextos en los CoreDataBooks (mergeChangesFromContextDidSaveNotification). Muchas gracias. Que tengas un buen día. Paolo aka SlowTree – SlowTree
Gracias a Dios. Estoy leyendo esto ha resuelto mis problemas. Estaba importando un gran conjunto de datos en una cadena de fondo y obteniendo una multitud de excepciones impredecibles. Instanciar el contexto en el hilo de fondo en lugar de pasarlo parece haber solucionado mis problemas. – tobyc
Este documento aún no se ha actualizado para aprovechar las mejoras muy importantes en iOS 5: el video al que me enlace en mi respuesta es ahora una mejor referencia. – JosephH