CoreData MagicalRecord 保存方法在 iPhone5 上崩溃

Posted

技术标签:

【中文标题】CoreData MagicalRecord 保存方法在 iPhone5 上崩溃【英文标题】:CoreData MagicalRecord save methods crashes on iPhone5 【发布时间】:2014-08-19 09:01:43 【问题描述】:

目前我正在使用MagicalRecord v2.3.0-beta.3 commit:d18e74fe435359238b9593c03e41c1ee0baa0b78 框架。我一直在 iPhone 5 上收到 1 个崩溃日志(来自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:] 方法,但它也崩溃了。

在有人建议的其他 *** 问题中,崩溃可能是由于一次删除、创建和保存到多个实体而导致的。就我而言,大约是 200 个已删除实体 + 200 个新实体。会不会导致崩溃?

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

【问题讨论】:

你是从主线程调用保存吗? 您的 parseAndSaveDictionaryReturnOperationArray 是否可能是从后台线程调用的? 【参考方案1】:

我终于知道发生了什么事。测试人员并没有像我所说的那样删除和安装应用程序。出现崩溃是因为 DB 架构已更改。也许我应该在开发过程中开始考虑数据库版本控制以避免这些问题。

感谢任何人的回答。

【讨论】:

以上是关于CoreData MagicalRecord 保存方法在 iPhone5 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.0,使用 CoreData (MagicalRecord) 保存下载状态

CoreData MagicalRecord 保存方法在 iPhone5 上崩溃

MagicalRecord 并不总是保存更改

使用 MagicalRecord 3 的 CoreData 内存设置

MagicalRecord 保存在应用程序第一次退出并重新运行之前不会持续存在

在 for 循环中传递数据时,MagicalRecord 正在保存 null