我正在构建我的第一个iOS应用程序,理论上应该非常简单,但我很难让它足够防弹,让我有信心将它提交到App Store.
简而言之,主屏幕具有表格视图,在选择行时,它将分段到另一个表格视图,该表格视图以主 - 细节方式显示与所选行相关的信息.基础数据每天从Web服务检索为JSON数据,然后缓存在Core Data存储中.删除当天之前的数据以阻止SQLite数据库文件无限增长.所有数据持久性操作都使用Core Data执行,并具有NSFetchedResultsController详细信息表视图的基础.
我看到的问题是,如果你在主屏幕和细节屏幕之间快速切换几次,同时检索,解析和保存新数据,应用程序会冻结或完全崩溃.似乎存在某种竞争条件,可能是由于Core Data在后台导入数据而主线程正在尝试执行获取,但我猜测.我在捕获任何有意义的崩溃信息时遇到了麻烦,通常它是Core Data堆栈中的一个SIGSEGV.
下表显示加载详细信息表视图控制器时发生的事件的实际顺序:
Main Thread Background Thread
viewDidLoad
Get JSON data (using AFNetworking)
Create child NSManagedObjectContext (MOC)
Parse JSON data
Insert managed objects in child MOC
Save child MOC
Post import completion notification
Receive import completion notification
Save parent MOC
Perform fetch and reload table view
Delete old managed objects in child MOC
Save child MOC
Post deletion completion notification
Receive deletion completion notification
Save parent MOC
在JSON数据到达时触发AFNetworking完成块后,将NSManagedObjectContext创建嵌套并传递给"导入器"对象,该对象解析JSON数据并将对象保存到Core …