Datos básicos: el estado de count sigue activo

Recibo el siguiente error en mi aplicación:

CoreData: error: error grave de la aplicación. Se detectó una exception durante el process de cambio de datos básicos. Este suele ser un error dentro de un observador de NSManagedObjectContextObjectsDidChangeNotification. la instrucción aún está activa con userInfo (null)

Todo lo que puedo encontrar parece indicar que podría estar teniendo problemas de subprocesss múltiples con mi context de object gestionado de datos básicos, pero parece que no puedo encontrar en ninguna parte de mi aplicación donde este sería el caso. Estoy accediendo y administrando un context de object gestionado en un hilo de background. El context solo es search y manipular objects en ese hilo de background. Cuando detecto guarda en ese context a través de NSManagedObjectContextObjectsDidSaveNotification, estoy combinando los cambios en un context diferente al que solo accedo en mi hilo principal. Cuando hago la llamada para combinar los cambios, se lanza el error. Es muy raro que esto ocurra, incluso con los mismos sets de datos.

Leí en alguna parte que es posible 'habilitar aserciones de subprocesss múltiples' usando '-com.apple.CoreData.ThreadingDebug 3', pero no he podido hacer que esto funcione. ¿Alguien sabe si esto es posible? Tenía la esperanza de que esto podría activar algunas afirmaciones que me ayudarían a encontrar dónde estoy jugando con el context en el hilo incorrecto o algo así.

¿Alguna otra pista sobre lo que podría estar sucediendo o cómo rastrear este tipo de problema?

Tuve un problema similar y encontré una manera de solucionarlo.

He creado un mecanismo para crear diferentes contexts basados ​​en nombres de subprocesss (1 subprocess = 1 context).

 #include <pthread.h> ... mach_port_t threadID = pthread_mach_thread_np(pthread_self()); NSString *threadName = [NSString stringWithFormat:@"%x", threadID]; NSManagedObjectContext *context = [singleton.threadsContexts objectForKey:threadName]; if (!context) { NSLog(@"Creating managed context for thread named '%@'", threadName); context = [[NSManagedObjectContext alloc] init]; [context setPersistentStoreCoordinator:[singleton.managedObjectContext persistentStoreCoordinator]]; //initialize dictionary in your singleton if it as not been yet if(!singleton.threadsContexts) { singleton.threadsContexts = [NSMutableDictionary new]; } [singleton.threadsContexts setObject:context forKey:threadName]; } return result; 

y luego, cuando necesito una versión completa de un object administrado en un subprocess de background, obtengo una copy del object dedicado a este subprocess:

 NSManagedObjectModel *myNewObject = [myBackgroundContext objectWithID:[myObject objectID]]; 

Espero que esta respuesta te ayude.