基于iOS9与iOS10的CoreData技术变化
2017-04-13范宝元
摘 要: CoreData是一个苹果原生的框架,它拥有像数据库一样存储数据的功能,但本身并不是数据库。本文探究了在iOS9与iOS10中CoreData的性能优化和发生的改变,并对这种变化进行相应的封装,以便兼容iOS9和iOS10。
关键词:iOS9 iOS10 CoreData 性能优化
中图分类号:TP273 文献标识码:A 文章编号:1003-9082(2017)02-0009-01
CoreData是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,开发者不需要编写任何SQL语句。在CoreData的技术堆栈主要分为一下几个部分,一个是NSManagedObjectContext管理的模型部分,管理着所有CoreData的托管模型对象;另一个是存储调度器NSPersistentStoreCoordinator,和SQL数据库进行数据交互,负责操纵存储器类NSPersistentStore实现SQLite的本地持久化。这就构成了CoreData的大体结构。在iOS10中,其技术堆栈发生了一些细微变化,详情见下文分析。
一、iOS9中的CoreData
在iOS9中,CoreDataStack是CoreData的核心,由一组CoreData核心对象组成,其技术堆栈图如下所示:
1.NSManagedObjectContext 对象管理上下文: 负责管理模型对象的集合;
2.NSManagedObjectModel 被管理的对象模型: 负责管理对象模型;
3.NSPersistentStoreCoordinator 存储调度器: 负责将数据保存到磁盘的;
其核心部分大致分为两个:一个是对象图管理,另一个是数据持久化;在这两部分的中间,即堆栈中间,是持久化存储协调器(Persistent Store Coordinator, PSC)。通过它将对象图管理部分和持久化部分绑在一起。当这两部分中的一部分需要和另一部分交互,将通过PSC来调节;并且,在iOS9之前,SQLite的文件存储在Documents,在iOS10之后,便把存储地址改为Library/Application/Support中。
二、iOS10中的CoreData
在iOS10中,系統默认生成的是一个CoreData存储容器NSPersistentContainer,NSPersistentContainer是iOS10.0新加的一个类,它的作用是管理CoreDataStack,可以理解为是CoreDataStack的容器,其对数据的增删改查与在iOS9中的过程相同,但是NSPersistentContainer不兼容iOS9,如果在iOS9中使用会闪退,需要进行适配处理,其核心代码如下:
三、NSPersistentContainer性能比较
下图为笔者通过使用iOS9与iOS10的CoreData往数据库中插入十万行数据所耗时间的对比图:
分析上图的对比结果,可以得出,传统的在主线程操作CoreData插入十万行数据,足足等了22s多;然而使用iOS10的NSPersistentContainer的多线程操作数据库插入十万行数据只需要2s多,比传统的CoreData速度快了将近10倍。
结束语
在iOS开发中,目前市场上有三种主流的数据库操作:FMDB、realm、和CoreData,然而CoreData的使用率目前普遍较低。对于一种数据库技术的选择,无非就是使用时是否方便和操作大量数据时,是否耗时耗性能。但是通过上面的对比测试可以看出,在iOS10推出之后,苹果公司对其原生的CoreData在性能上进行了大量优化。
作者简介:范宝元(1993.1-),男,福建,研究方向:智能信息服务系统。