2012-09-30 2 views
0

Mon code exécute un certain nombre de tâches à l'aide des données de base, puis, lorsque je vais enregistrer, il se bloque sans erreur. Mon code pour la sauvegarde est tout simplement:L'abandon de l'application sur [managedObjectContext save:] sans erreur

[[self managedObjectContext] save:&error]; 

NSLog(@"Error: %@", error); 

Il ne parvient pas à la ligne d'erreur, il est tombé en panne et quitter à l'écran d'accueil en ce moment-là.

J'ai tout autre chose que 'Guard Malloc' sélectionné dans Diagnostics.

C'est le journal que je reçois quand il exécute la commande de sauvegarde:

CoreData: sql: BEGIN EXCLUSIVE 
CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ? 
CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ? 
CoreData: sql: COMMIT 
CoreData: sql: BEGIN EXCLUSIVE 
CoreData: sql: INSERT INTO ZENTRY(Z_PK, Z_ENT, Z_OPT, ZLOCATION, ZBOOKMARKED, ZCREATIONDATE, ZENTRYID, ZMESSAGE, ZSECTIONIDENTIFIER, ZTICDSSYNCID, ZVERSION) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
CoreData: sql: COMMIT 
CoreData: sql: pragma page_count 
CoreData: annotation: sql execution time: 0.0047s 
CoreData: sql: pragma freelist_count 
CoreData: annotation: sql execution time: 0.0069s 

Il n'y a aucune mention de toute erreur avant cela. Comment puis-je avoir une idée de ce qui bloque mon application?

EDIT: Je sais maintenant que cela se produit après un appel à [NSEntityDescription insertNewObjectForEntityForName:@"Entry" inManagedObjectContext:[self managedObjectContext]]; et qu'il est provoqué par une méthode effectuée sur mon magasin de données principal par TICoreDataSync avant cela. Je ne peux pas changer ce code, ou le retirer de travailler avec mon magasin de données principal. Je pense que c'est un problème de faire avec le magasin étant accédé sur plusieurs threads, alors maintenant je dois savoir comment faire face à cela, sur le thread principal?

Répondre

3

Évidemment, le MOC est corrompu. Est-il accédé à partir de plusieurs threads?

Ce que je ferais, avec chaque changement (où moc est sauvegardable - cohérent), tenterait une sauvegarde. L'endroit où la corruption se produit va s'écraser, donc vous savez maintenant au moins plus ou moins où le problème est.

Je fais cela dans mon application - en fait, tous les dev builds sont sauvegardés en permanence, seuls les builds de déploiement et d'assurance qualité ont été désactivés. J'ai trouvé beaucoup de bugs de cette façon. Envelopper les sauvegardes dans certaines déclarations de drapeau ou écrire une macro.

+0

je me suis déplacé autour, et compris qu'il se produit uniquement après avoir appelé '[NSEntityDescription insertNewObjectForEntityForName: @ "Entrée" inManagedObjectContext: [self managedObjectContext]];'. C'est toujours sur le contexte principal, donc je suppose que ce doit être un autre code qui s'exécute sur un contexte d'arrière-plan. J'ai TICoreDataSync mis en place avec dropbox, et qui s'exécute sur le magasin de données de base avant que ce code arrive, et c'est ce qui cause le problème, mais je ne peux pas changer leur code. Comment puis-je rendre le thread de fond compatible? – Andrew

+0

Ceci est une bibliothèque open source - vous avez accès à leur code. Déterminez comment partager la même file d'attente de répartition. Je n'ai aucune expérience avec cela, mais au moins maintenant vous connaissez les problèmes. Publiez une demande d'aide sur leur site github, ou google cette bibliothèque et «comment partager une file d'attente de répartition» - quelque chose comme ça. –

Questions connexes