2009-05-23 8 views
6

Tengo una aplicación Core Data. En el hilo del productor, extraigo información de un servicio web y la almaceno en mi objeto y llamo a guardar. Mi objeto de consumo es un controlador de vista de tabla que muestra el mismo. Sin embargo, la aplicación se bloquea y me sale NSFetchedResultsController de error: se esperaba encontrar objeto (entidad: FeedEntry; id: 0xf46f40; datos:) en la sección (nulo) para su eliminaciónProducer Consumer Issue with Core Data

en la consola. Cuando lo depuro, todo funciona bien. Entonces entendí que es como un problema de raza.

¿Cómo se resuelve este tipo de problema? ¿Cuál es la mejor manera de diseñar una aplicación productor-consumidor con datos básicos?

Respuesta

16

Si se dirige a Leopard o más tarde, Apple ha facilitado las cosas.

En su hilo productor, cree un MOC con el mismo PSC que el MOC en su hilo principal. Puede extraer objetos de su servicio web en este hilo, crear los nuevos objetos y guardarlos de forma normal.

En su hilo de consumidor, agregue su controlador como observador para NSManagedObjectContextDidSaveNotification. A su función debería ser algo como:

- (void) managedObjectContextDidSave:(NSNotification *)notification 
{ 
    NSManagedObjectContext *managedObjectContext = [notification object]; 
    if(managedObjectContext != self.managedObjectContext) 
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; 
} 

De esta manera, los objetos guardados en el hilo productor será automáticamente retirada en su hilo consumidor.

+1

sbooth ... Su respuesta fue perfecta ... Para otros, para suscribirse a la NSManagedObjectContextDidSaveNotification, añadir el siguiente código ... \t \t [[NSNotificationCenter defaultCenter] addObserver: AppDelegate \t \t \t \t \t \t \t \t \t \t \t \t selector: @selector (managedObjectContextDidSave :) \t \t \t \t \t \t \t \t \t \t \t \t \t nombre: NSManagedObjectContextDidSaveNotification \t \t \t \t \t \t \t \t \t \t \t \t objeto: uno mismo.managedObjectContext]; – Mugunth

+2

@Mugunth Kumar, ya que él está verificando en qué contexto es probable que pase el parámetro param, quiere observar el nuevo contexto creado para el hilo de bg, no el contexto del delegado de la aplicación. – marchinram

+0

Exactamente lo que estaba buscando. Gracias. – JHollanti

0

Core Data generalmente no es seguro para subprocesos. Mi preferencia sería hacer un mínimo de trabajo en el hilo de fondo y pasar los datos necesarios para crear entidades de Datos centrales al hilo principal una vez que lo hayas recuperado de tu servicio web. Sin embargo, eche un vistazo al this document. Existen algunas estrategias para usar los datos centrales en los hilos, si es necesario.

+0

"Los datos principales generalmente no son seguros para subprocesos" es bastante engañoso. Si crea un contexto para cada subproceso (o cada operación, los contextos son bastante livianos), el resto del marco de datos principales se ocupa de casi todo lo demás (todo lo que tiene que hacer es manejar NSManagedObjectContextDidSaveNotifications como se describió anteriormente). – hatfinch

+0

Estoy de acuerdo, es muy engañoso. Gracias – JHollanti