2010-03-08 8 views
7

Tengo un problema donde estoy actualizando una relación muchos a muchos en un subproceso en segundo plano, que funciona bien en esa amenaza, pero cuando envío el objeto a la principal enhebrar los cambios no se muestran Si cierro la aplicación y vuelvo a abrir, la información se guarda bien y los cambios se muestran en el hilo principal. También el uso de [bloqueo de contexto] en lugar de un contexto diferente de objeto administrado funciona bien.Sincronización de subproceso de contexto de objeto gestionado Datos principales

He tratado NSManagedObjectContext:

- (BOOL)save:(NSError **)error; 
- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag;  

en diferentes etapas a lo largo del proceso, pero no parece ayudar.

Mi código de datos núcleo utiliza la siguiente getter para garantizar las operaciones son seguros hilo:

- (NSManagedObjectContext *) managedObjectContext 
{ 

    NSThread * thisThread = [NSThread currentThread]; 
    if (thisThread == [NSThread mainThread]) 
    { 
     //Main thread just return default context 
     return managedObjectContext; 
    } 
    else 
    { 
     //Thread safe trickery 
     NSManagedObjectContext * threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:CONTEXT_KEY]; 
     if (threadManagedObjectContext == nil) 
     { 
      threadManagedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease]; 
      [threadManagedObjectContext setPersistentStoreCoordinator: [self persistentStoreCoordinator]]; 
      [[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:CONTEXT_KEY]; 
     } 

     return threadManagedObjectContext; 
    } 
} 

y cuando paso objeto entre los hilos que estoy usando

-(NSManagedObject*)makeSafe:(NSManagedObject*)object 
{ 
    if ([object managedObjectContext] != [self managedObjectContext]) 
    {    
     NSError * error = nil; 
     object = [[self managedObjectContext] existingObjectWithID:[object objectID] error:&error]; 

     if (error) 
     { 
      NSLog(@"Error makeSafe: %@", error); 
     } 
    } 

    return object; 
} 

Cualquier ayuda apreciado

+0

Editar: Extrañaba que estuviera usando threadDictionary anteriormente. – Wendel

Respuesta

9

Si guarda el contexto de fondo en el hilo de fondo y luego escucha por NSManagedObjectContextObjectsDidChangeNotification en el hilo principal, puede llamar al -mergeChangesFromContextDidSaveNotification: en el contexto principal (en el hilo principal) y los cambios aparecerán tan pronto como realice el guardado en el hilo de fondo.

Cuestiones relacionadas