在Swift中创建具有向后兼容性的核心数据栈
在2017年,我们生活在一个仍然存在非iOS 10设备的世界。 如果您的应用程序的目标版本早于iOS 10的iOS版本或macOS Sierra(10.12),您将无法利用Core Data的最新“堆栈创建”类NSPersistentContainer
。 所以,你可以做什么?
虽然NSPersistentContainer
确实旨在简化堆栈的创建过程,但最终还是要弄乱其中一些Core Data管道并不可怕。
创建核心数据栈的最终目标
创建核心数据堆栈的最终目标是获取NSManagedObjectContext
的实例。 而已。
大多数依赖Core Data的应用最终都会发出获取请求来获取数据,或者连接其他类,例如NSFetchedResultsController
。 为了使这些事情起作用,您必须提供NSManagedObjectContext
的实例。
NSManagedObjectContext
是整个系统中的中心齿轮,它使其他齿轮转动。
所以。 底线:一旦有了NSManagedObjectContext
实例,您就很NSManagedObjectContext
。 这就是创建核心数据堆栈最终为您提供的功能。
创建核心数据堆栈的3个步骤
可以大约3个步骤创建Core Data堆栈:
1)初始化NSManagedObjectModel的实例
这对应于您的.xcdatamodeld文件。 您需要浏览左侧的项目导航器,并找到.xcdatamodeld文件以记录此步骤的名称。
初始化NSManagedObjectModel
//初始化NSManagedObjectModel let modelURL = Bundle.main.url(forResource:“ NameOfDataModel”,withExtension:“ momd”)保护let model = NSManagedObjectModel(contentsOf:modelURL!)else {fatalError(“未找到模型”)}
//初始化NSManagedObjectModel
让modelURL = Bundle.main.url(forResource:“ NameOfDataModel”,withExtension:“ momd”)
警卫让模型= NSManagedObjectModel(contentsOf:modelURL!)else {fatalError(“找不到模型”)}
2)使用NSManagedObjectModel实例和NSPersistentStoreType初始化并配置NSPersistentStoreCoordinator实例
首先创建NSManagedObjectModel
实例的原因是, 下一步取决于该实例。 NSPersistentStoreCoordinator
将使用您的NSManagedObjectModel
实例进行自我配置,并根据您要使用的NSPersistentStoreType
准备创建正确的持久性存储类型。
在下面的代码示例中,我使用NSSQLiteStoreType
创建一个SQLite持久存储。 无论您使用哪种持久性存储, NSPersistentStoreCoordinator
需要您的托管对象模型实例。
初始化和配置NSPersistentStoreCoordinator
//使用NSPersistentStore配置NSPersistentStoreCoordinator
让psc = NSPersistentStoreCoordinator(managedObjectModel:model)
让storeURL =试试! 文件管理器
。默认
.url(用于:.documentDirectory,位于:.userDomainMask,适当于:无,创建:true)
.appendingPathComponent(“ NameOfDataModel.sqlite”)
尝试! psc.addPersistentStore(ofType:NSSQLiteStoreType,configurationName:nil,at:storeURL,选项:nil)
3)初始化NSManagedObjectcontext实例,并为其分配NSPersistentStoreCoordinator实例
最后一步是初始化NSManagedObjectContext
实例,并为其分配NSPersistentStoreCoordinator
实例。
初始化NSManagedObjectContext
//创建并返回NSManagedObjectContext
let context = NSManagedObjectContext(concurrencyType:.mainQueueConcurrencyType)
context.persistentStoreCoordinator = psc
放在一起—用代码创建Core Data堆栈
创建Core Data堆栈时,我希望将代码封装在一个独立的函数中,该函数返回NSManagedObjectContext
的实例。
这是三个步骤的总和:
func createMainContext()-> NSManagedObjectContext {
//初始化NSManagedObjectModel
让modelURL = Bundle.main.url(forResource:“ NameOfDataModel”,withExtension:“ momd”)
警卫让模型= NSManagedObjectModel(contentsOf:modelURL!)else {fatalError(“未找到模型”)}
//使用NSPersistentStore配置NSPersistentStoreCoordinator
让psc = NSPersistentStoreCoordinator(managedObjectModel:model)
让storeURL =试试! 文件管理器
。默认
.url(用于:.documentDirectory,位于:.userDomainMask,适当于:无,创建:true)
.appendingPathComponent(“ NameOfDataModel.sqlite”)
尝试! psc.addPersistentStore(ofType:NSSQLiteStoreType,configurationName:nil,at:storeURL,选项:nil)
//创建并返回NSManagedObjectContext
let context = NSManagedObjectContext(concurrencyType:.mainQueueConcurrencyType)
context.persistentStoreCoordinator = psc
返回上下文
}
获得诸如createMainContext()
类的函数后,就可以调用它来获取完全配置的NSManagedObjectContext
实例。
我强烈建议您避免在任何视图控制器中调用它。 相反,我的建议是调用它以在AppDelegate's
application(_:didFinishLaunchingWithOptions:)
函数内获取您的NSManagedObjectContext
实例。 从那里,您可以将其传递给您的第一个视图控制器,并从第一个视图控制器传递给通过prepare(for segue:sender:)
需要它的其他视图控制器。
有关这种“依赖注入”策略的更多信息,或者如果您更喜欢视觉学习,请查看我的Pluralsight课程“使用Swift的核心数据基础知识” —该课程将教您使用Core Data进行建模,管理和显示数据!