El context de object gestionado no se guarda en el almacén persistente

Tengo una operación de subprocess que crea un nuevo object gestionado, lo guarda en el almacén persistente y luego pasa el ID del object nuevo a través de NSNotification al subprocess principal para su posterior procesamiento

Sin embargo, cuando bash acceder al object gestionado recién creado desde el hilo principal, todos los valores que establezco en el hilo de background vuelven como vacíos.

** hilo de background

// create a new managed object context for this thread NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init]; [context setPersistentStoreCoordinator:[appDelegate persistentStoreCoordinator]]; [context setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; // create the object MyObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"MyObject" inManagedObjectContext:context]; [newManagedObject setAValue:@"A"]; [newManagedObject setBValue:@"B"]; [newManagedObject setCValue:@"C"]; // save it on the main thread [context performSelectorOnMainThread:@selector(save:) withObject:nil waitUntilDone:NO]; // post notification to main thread, pass the objectID NSMutableDictionary *userInfo = [NSDictionary dictionaryWithObject:[newManagedObject objectID] forKey:@"objectID"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"doneInsertingObject" object:userInfo]; [context release]; 

** Hilo principal

 ... // register notification for background thread [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeContextChanges:) name:NSManagedObjectContextDidSaveNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomethingWithObject:) name:@"doneInsertingObject" object:nil]; ... - (void)doSomethingWithObject:(NSNotification*)noif { if([NSThread isMainThread] == NO) { // run this on the main thread [self performSelectorOnMainThread:_cmd withObject:noif waitUntilDone:NO]; return; } // get managed object from objectID NSDictionary *userInfo = [noif userInfo]; MyObject *object = (MyObject*)[appDelegate.managedObjectContext objectWithID:[userInfo valueForKey:@"objectID"]]; [appDelegate.managedObjectContext refreshObject:object mergeChanges:YES]; // these should return 'A, B, C' but all three return 'nil' NSLog(@"aValue: %@", object.aValue); NSLog(@"bValue: %@", object.bValue); NSLog(@"cValue: %@", object.cValue); } // merge background thread moc with main moc - (void)mergeContextChanges:(NSNotification *)notification { if([NSThread isMainThread] == NO) { // run this on the main thread [self performSelectorOnMainThread:_cmd withObject:notification waitUntilDone:NO]; return; } // fault all updated objects NSSet *updated = [[notification userInfo] objectForKey:NSUpdatedObjectsKey]; for(NSManagedObject *thing in updated) { [[appDelegate.managedObjectContext objectWithID:[thing objectID]] willAccessValueForKey:nil]; } // merge changes to the main managed object context [appDelegate.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; // force processing of any pending changes [appDelegate.managedObjectContext processPendingChanges]; } 

Intenté cambiar las políticas de combinación y no hubo diferencia.

Intenté agregar el logging al método de combinación de context y confirmé haber recibido una notificación "insertada" del hilo de background antes de llamar al método doSomethingWithObject: en el hilo principal.

¿Por qué no se actualizan mis datos a la tienda persistente?

No puedo ver dónde guardas el context para tu hilo de background. Si es esta linea

 // save it on the main thread [context performSelectorOnMainThread:@selector(save:) withObject:nil waitUntilDone:NO]; 

No sé si es correcto. Debe save el context del hilo que lo creó y no en el hilo principal.

 [context save:&error]; 

Para get más información, sugiero que lea los artículos de Marcus Zarra importing-and-displaying-large-data-sets-in-core-data . Puede encontrar el código de muestra al final. Además, puede encontrar más información en using-core-data-on-multiple-threads .

Espero eso ayude.

Su NSManagedObjectContext debe savese en el hilo en el que se creó (como @Flex_Addicted pondenetworking).

Una vez que se haya guardado en el subprocess de background, se enviará una notificación que le indicará que combine los cambios del context de background al context principal.

Los documentos de las manzanas leen "Guardar en un subprocess de background es propenso a errores": esto no está relacionado con el uso de otro NSManagedObjectContext . Dicen que si tiene 1 context e intenta enviar la operación de salvar al background, ESO es propenso a errores. Si tiene contexts múltiples, solo deben usarse dentro de un hilo a la vez.