在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进行建模,管理和显示数据!