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 3 的 CoreData 内存设置