2011-03-08 10 views
9

Tengo una aplicación de iPhone que a veces se congela al guardar CoreData y luego no se reinicia. Tuve un segundo hilo que usa la base de datos, pero creo que he seguido el patrón para crear un contexto separado para ese hilo. Aquí está el informe de fallas del relanzamiento. ¿Algunas ideas?Congelamiento de la aplicación en CoreData save

He intentado cambiarlo para que solo se ejecute con un hilo y aquí está el último punto de congelación después de ingresar el fondo.

#0 0x30851b98 in fsync 
#1 0x3094e694 in _sqlite3_purgeEligiblePagerCacheMemory 
#2 0x3094e6b8 in _sqlite3_purgeEligiblePagerCacheMemory 
#3 0x30945372 in sqlite3_compileoption_get 
#4 0x30957f06 in sqlite3_extended_errcode 
#5 0x3095dc20 in sqlite3_extended_errcode 
#6 0x3095dd8e in sqlite3_extended_errcode 
#7 0x309646f8 in sqlite3_clear_bindings 
#8 0x3098845a in sqlite3_open16 
#9 0x3094495a in sqlite3_step 
#10 0x31a1dc20 in _execute 
#11 0x31acc6e8 in -[NSSQLiteConnection commitTransaction] 
#12 0x31aca646 in -[NSSQLiteConnection endPrimaryKeyGeneration] 
#13 0x31abeab4 in -[NSSQLCore prepareForSave:] 
#14 0x31a4acd0 in -[NSSQLCore saveChanges:] 
#15 0x31a1591e in -[NSSQLCore executeRequest:withContext:error:] 
#16 0x31a1538a in -[NSPersistentStoreCoordinator executeRequest:withContext:error:] 
#17 0x31a48544 in -[NSManagedObjectContext save:] 
#18 0x000080aa in -[KPersistence saveManagedObjects:] at KPersistence.m:242 
#19 0x00004320 in -[KinKastAppDelegate applicationDidEnterBackground:] at KinKastAppDelegate.m:126 

Aquí es mi implementación de saveManagedObjects

-(BOOL)saveManagedObjects:(NSError **)error 
{ 
    [persistentStoreCoordinator lock]; 
    BOOL success = YES; 
    if (managedObjectContext != nil) { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:error]) { 
      VLog(@"Unresolved error %@, %@", *error, [*error userInfo]); 
      success = NO; 
     } 
    } 
    [persistentStoreCoordinator unlock]; 
    return success; 
} 
+0

+1 mismo problema, no hay solución. –

+0

Lo he resuelto por mí. El problema era guardar un valor flotante o doble en un campo entero. Esto causó un bucle de fusión infinito entre el nsnumber de coma flotante en la memoria y el nsnumber entero que siempre se leyó desde el db en el disco. –

+0

hmm ... gracias por la pista. Voy a tener que revisar dos veces todo mi código, que parece que va a tomar un tiempo: S –

Respuesta

2

Así que ahora creen el problema era que a veces escribía un NSNumber con valor flotante en un campo entero. Esto causó que la copia en la memoria fuera diferente que la copia leída de la base de datos, y esto causó el ciclo de fusión infinito. Pero si reinició la aplicación, funcionó bien porque el valor era simplemente un número entero a partir de ese momento.

13

Al utilizar datos básicos a partir de múltiples hilos, asegúrese de bloquear el PSC antes de una operación de almacenamiento:

[self.persistentStoreCoordinator lock]; 
NSManagedObjectContext *context = //your context; 
[context save:&error]; 
if (error) { 
    // handle error 
} 
[self.persistentStoreCoordinator unlock]; 
+0

Gracias, de hecho, no estaba haciendo este bloqueo. Pero no parece ser la solución completa. –

+0

publique el código alrededor de su operación de guardado y luego – amattn

+0

Intenté cambiarlo a solo ejecute en un hilo y sigo teniendo el mismo problema. –

Cuestiones relacionadas