CoreData MagicalRecord保存方法在iPhone5上崩溃

3

目前我正在使用MagicalRecord v2.3.0-beta.3 commit:d18e74fe435359238b9593c03e41c1ee0baa0b78框架进行工作。我一直在iPhone 5上收到一个崩溃日志(来自Crashlytics)。应用程序仍在开发中。崩溃日志如下:

Thread : Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x38eee626 objc_msgSend + 5
1  Foundation                     0x2f06d02d -[NSError dealloc] + 60
2  libobjc.A.dylib                0x38ef3b6b objc_object::sidetable_release(bool) + 174
3  libobjc.A.dylib                0x38ef40d3 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 358
4  CoreFoundation                 0x2e67d481 _CFAutoreleasePoolPop + 16
5  Foundation                     0x2f0778e3 -[NSAutoreleasePool drain] + 122
6  CoreData                       0x2e4bdfbf -[NSManagedObjectContext save:] + 942
7  MyApp                          0x00162f9f __70-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:]_block_invoke15 (NSManagedObjectContext+MagicalSaves.m:82) // here app crashes
8  CoreData                       0x2e5219cd developerSubmittedBlockToNSManagedObjectContextPerform + 88
9  CoreData                       0x2e521b13 -[NSManagedObjectContext performBlockAndWait:] + 114
10 MyApp                          0x00162e51 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:] (NSManagedObjectContext+MagicalSaves.m:116)
11 MyApp                          0x000a2b0d -[SPNCoreDataHandler parseAndSaveDictionaryReturnOperationArray:withSaving:] (SPNCoreDataHandler.m:70)
12 MyApp                          0x00078f21 __102-[SPNApiHandler getAllDataWithDownloadingSuccessBlock:savingSuccessBlock:downloadStatus:failureBlock:]_block_invoke (SPNApiHandler.m:69)
13 MyApp                          0x000795b9 __66-[SPNApiHandler sendGetRequestWithPath:successBlock:failureBlock:]_block_invoke (SPNApiHandler.m:174)
14 libdispatch.dylib              0x393cdd53 _dispatch_call_block_and_release + 10
15 libdispatch.dylib              0x393cdd3f _dispatch_client_callout + 22
16 libdispatch.dylib              0x393d06c3 _dispatch_main_queue_callback_4CF + 278
17 CoreFoundation                 0x2e714641 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
18 CoreFoundation                 0x2e712f0d __CFRunLoopRun + 1308
19 CoreFoundation                 0x2e67d729 CFRunLoopRunSpecific + 524
20 CoreFoundation                 0x2e67d50b CFRunLoopRunInMode + 106
21 GraphicsServices               0x335ec6d3 GSEventRunModal + 138
22 UIKit                          0x30fde871 UIApplicationMain + 1136
23 MyApp                          0x0009c347 main (main.m:16)

以下是我编写的代码:

注意:出于可读性考虑,我删除了此方法的某些部分(这就是为什么该方法返回void而不是NSArray)。

- (NSArray *)parseAndSaveDictionaryReturnOperationArray:(NSDictionary *)dictionary withSaving:(BOOL)saveSynchrounously {

    [self truncateAll]; //method which removes all entries in coreData

    /* methods below creates entities from array given in dictionary
       using [NSManagedObject MR_createEntity] method 
       e.g. Contact *contact = [Contact MR_createEntity]; */

    [self saveContacts:dictionary[@"contact"]];
    [self savePeople:dictionary[@"person"]];
    [self saveBuildings:dictionary[@"place"]];
    [self saveSessions:dictionary[@"session"]];
    [self saveLectures:dictionary[@"program"]];
    [self savePartners:dictionary[@"partners"]];
    [self saveSponsors:dictionary[@"sponsors"]];
    [self saveExhibitorsPlans:dictionary[@"exhibitorplan"]];
    [self saveMeetingPlans:dictionary[@"meetingplan"]];
    [self saveOrganizationalInformation:dictionary[@"info"]];

    [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

    //continue executing method...
}

我也尝试使用[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreWithCompletion:]方法,但它也崩溃了。

在其他Stackoverflow问题中,有人建议,崩溃可能是因为一次删除、创建和保存太多实体。在我的情况下,大约有200个被删除的实体和200个新实体。这会导致崩溃吗?

在其他设备(iPhone 4s,iPhone 5s,iPad 2,iPad4,iPad mini)上,它运行良好。你有什么想法我做错了什么?


你是从主线程调用save函数吗? - Daniel Galasko
1
你的 parseAndSaveDictionaryReturnOperationArray 函数可能是被后台线程调用了吗? - Daniel Galasko
1个回答

0

最后我终于找到了原因。测试人员没有按照我的要求删除和安装应用程序。崩溃的原因是数据库模式发生了变化。也许我应该在开发过程中开始考虑数据库版本控制,以避免这种问题。

感谢大家的回答。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接