应用程序冻结CoreData保存

我有一个iPhone应用程序在保存CoreData时有时会冻结,然后不会重新启动。 我有一个使用数据库的第二个线程,但我认为我已经按照该模式为该线程创build了一个单独的上下文。 这是重新启动的崩溃报告。 有任何想法吗?

我试图改变它只能运行一个线程,这里是进入后台后的最新冻结点。

#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 

这里是我的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; } 

从多个线程使用Core Data时,确保在保存操作之前lockingPSC:

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

所以我现在认为,问题是我有时写一个浮点值的NSNumber到一个整数字段。 这导致内存中的副本不同于从数据库中读取的副本,并且这导致了无限的合并循环。 但是,如果你重新启动应用程序它工作得很好,因为该值是一个简单的整数从那时起。