2011-03-08 3 views
9

J'ai une application iPhone qui se bloque parfois lors de l'enregistrement de CoreData et ne redémarre pas. J'ai eu un deuxième thread qui utilise la base de données, mais je pense que j'ai suivi le modèle pour faire un contexte séparé pour ce thread. Voici le rapport d'accident de la relance. Des idées?L'application se bloque sur CoreData save

J'ai essayé de le changer pour ne fonctionner qu'avec un seul fil et voici le dernier point de gel après être entré dans l'arrière-plan.

#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 

Voici ma mise en œuvre 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 même problème, pas de solution. –

+0

Je l'ai résolu pour moi. Le problème était d'enregistrer une valeur flottante ou double dans un champ entier. Cela provoquait une boucle de fusion infinie entre le nsnumber à virgule flottante en mémoire et le nsnumber entier qui était toujours lu à partir de la db sur le disque. –

+0

hmm .. merci pour l'indice. Je vais devoir vérifier tout mon code qui a l'air d'être long: S –

Répondre

2

Je crois maintenant le problème était que j'écrivais parfois un NSNumber avec la valeur float à un champ entier. Cela a provoqué que la copie en mémoire soit différente de la copie lue dans la base de données, ce qui a provoqué la boucle de fusion infinie. Mais si vous avez redémarré l'application, cela a bien fonctionné car la valeur était simplement un entier à partir de ce moment.

13

Lors de l'utilisation des données de base de plusieurs threads, assurez-vous de verrouiller votre PSC avant une opération de sauvegarde:

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

Merci, en effet je ne faisais pas ce verrouillage.Mais il ne semble pas être la solution complète –

+0

poster le code autour de votre opération de sauvegarde puis – amattn

+0

J'ai essayé de le changer en il suffit de courir sur un thread et je reçois toujours le même problème –