2011-10-25 40 views
12

estoy recibiendo el siguiente error en mi aplicación:datos básicos: declaración es todavía activo

CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. statement is still active with userInfo (null)

Todo lo que puedo encontrar parece indicar lo que puede estar teniendo problemas multi-threading con objeto mis datos básicos logrado contexto, pero no puedo encontrar en ninguna parte de mi aplicación donde este sea el caso. Estoy accediendo y administrando un contexto de objeto gestionado en una cadena de fondo. El contexto solo busca y manipula objetos en ese hilo de fondo. Cuando detecto las salvaciones en ese contexto a través de NSManagedObjectContextObjectsDidSaveNotification, estoy fusionando los cambios en un contexto diferente al que solo accedo en mi hilo principal. Cuando realizo la llamada para fusionar los cambios, se produce el error. Es muy raro que esto ocurra, incluso con los mismos conjuntos de datos.

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

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

+1

¿Mi respuesta fue útil? –

+0

Lo leyó en [TN2124: Magia de depuración de Mac OS X] (https://developer.apple.com/library/ios/#technotes/tn2004/tn2124.html#SECCOREDATA). El bit clave es: "Esta característica requiere la variante de depuración del marco". Si tuviera esa variante, podría establecer la variable de entorno 'DYLD_IMAGE_SUFFIX = _debug' y cargaría' CoreData_debug' en lugar de 'CoreData' para el marco. Desafortunadamente, esas variantes parecen existir solo para OS X 10.5.x. :( –

Respuesta

13

Tuve un problema similar y encontré la manera de resolverlo.

He creado un mecanismo que crea diferentes contextos basados ​​en nombres de subprocesos (1 subproceso = 1 contexto).

#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 objeto administrado en un subproceso de fondo, puedo obtener una copia del objeto dedicado a este tema:

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

Esperanza esta respuesta le ayudará.

+1

[[NSThread currentThread] name] devuelve "" para mí en iOS 7. [Esta respuesta] (http://stackoverflow.com/a/15523049/1571490) me dio una cadena correcta. Además de eso, funcionó a la perfección y parece que todos mis problemas con el procesamiento de datos básicos están corregidos. ¡Gracias! – fifarunnerr

+0

¡Funciona muy bien! No he visto mi caída desde que uso este código. También tuve que usar la técnica de fifa para obtener el nombre del hilo. te olvido de inicializar NSMutableDictionary en tu singleton ... Corrí un poco en círculos hasta que me di cuenta de que :: DUH :: – RyanG

+1

Esta es una respuesta bastante antigua y para proyectos más nuevos, estoy usando Magical Record que tiene una versión -en apoyo para datos de núcleos de multi-threading. La documentación no es excelente, pero ahorra mucho tiempo una vez que sepa cómo usar esta lib. https://github.com/magicalpanda/MagicalRecord –

Cuestiones relacionadas