Las actualizaciones de Conetworkingata no se ven en contexts de objects gestionados diferentes: los datos son diferentes entre contexts.

Estamos teniendo este problema donde diferentes subprocesss ven diferentes datos en los mismos loggings pero con diferentes contexts de objects gestionados (moc). Nuestra aplicación se sincroniza en segundo plano con una API de server. Toda la synchronization se realiza en su propio hilo y su propio moc. Sin embargo, descubrimos que cuando los datos se actualizan en el moc principal, el cambio en los datos no se muestra en el background moc. ¿Alguna idea de lo que podría estar pasando? Aquí hay algunos más detalles: estamos utilizando un envío central grande para poner las operaciones de synchronization en su propio hilo: hemos comprobado qué cosas de la queue se están ejecutando y todo está sucediendo en la queue esperada.

- (void) executeSync; { dispatch_async(backgroundQueue, ^(void) { if([self isDebug]) NSLog(@"ICSyncController: executeSync queue:%@ \n\n\n\n\n", [self queue]); for(id <ICSyncControllerDelegate> delegate in delegates){ [delegate syncController:self]; } if([ICAccountController shanetworkingInstance].isLoggedIn == YES && shouldBeSyncing == YES) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 300ull * NSEC_PER_SEC), dispatch_get_current_queue(), ^{ [self executeSync]; }); } }); } 

así es como creamos el background moc y hemos confirmado que se creó en la queue de background.

 - (NSManagedObjectContext*)backgroundObjectContext { if (_backgroundObjectContext) return _backgroundObjectContext; _backgroundObjectContext = [[NSManagedObjectContext alloc] init]; [_backgroundObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator]; [_backgroundObjectContext setStalenessInterval:0.0]; return _backgroundObjectContext; } 

Debería agregar que nuestro background moc requiere datos y esos loggings devueltos de esa acción todavía tienen los valores anteriores para algunos campos. ¿Cómo obtiene el background moc los datos actuales que ya fueron guardados por el moc principal? Pensé que solo por requerir obtendría el estado actual de estos loggings.

por requerying me refiero a lo siguiente: El MOC de background está ejecutando otra "consulta" para get datos "frescos" después de que los loggings hayan sido modificados por el moc principal, sin embargo, los datos tienen valores antiguos, no los valores actualizados vistos en el moc principal.

 + (NSArray *)dirtyObjectsInContext:(NSManagedObjectContext *)moc { NSPnetworkingicate *pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"SUBQUERY(memberships, $m, $m.category.name == %@ AND $m.syncStatus > %d).@count > 0", MANAGED_CATEGORY_FAVORITES, ManagedObjectSynced]; return [self managedObjectsWithPnetworkingicate:pnetworkingicate inContext:moc]; } 

Su ayuda es muy apreciada, ya que hemos estado tratando de resolver esto, o encontrar un trabajo que no incluya abandonar nuestros hilos durante días.

Así es como se supone que funciona, de hecho, una function importante del context del object gestionado es protegerlo de los cambios realizados en los datos que se crean en otros subprocesss. Imagine el caos que se produciría si tuviera un hilo de background que modificara los mismos objects que el hilo principal estaba usando sin algún tipo de esquema de synchronization.

Lea Comunicación de cambios entre contexts para aprender cómo combinar cambios de un context a otro.

Utilizo el siguiente código para escuchar los cambios en el context 2, para que el context 1 se mantenga actualizado:

  NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:context1 selector:@selector(contextTwoUpdated:) name:NSManagedObjectContextDidSaveNotification object:context2]; 

hace que este método se invoque en el context 1 e invoque el método de combinación:

 - (void)contextTwoUpdated:(NSNotification *)notification { [context1 mergeChangesFromContextDidSaveNotification:notification]; } 

un efecto secundario de esto es cualquier NSFetchedResultsController que se adjunta a context1 enviará una variedad de posts a su delegado informándole de los cambios,

Nunca he tratado de escuchar en ambas direcciones mientras el usuario cambia el object y lo actualiza desde atrás, sospecho que es posible que deba administrar combinaciones si ese es el caso, ya que es unidireccional (y todo impulsado por el usuario) para mí Supongo que todas las actualizaciones son válidas