良好的iOS核心数据堆栈

我当时正在编写一个新的仅限iOS 10+的核心数据堆栈,并认为我将展示该过程变得多么简单。

数据协调员

我真的很想让一个人来管理核心数据堆栈。 传统上总是调用此CoreDataManager。 现在,将其命名为DataCoordinator。

 最终课程DataCoordinator { 
私有静态var协调器:DataCoordinator?
公共类func sharedInstance()-> DataCoordinator {
如果协调员==无{
协调器= DataCoordinator()
}
返回协调员!
}
私人init(){
}
}

3层架构

TL; DR跳至下一部分。 这不再是必需的。

现在我们需要设置一个核心数据栈。 我们需要有2个堆栈或2个上下文。

  1. 用于在主线程中读取和显示数据。
  2. 用于主要通过api调用和其他后台进程写入数据

这是通过使用3层体系结构来最佳实现的。

P1用于保存到持久性存储。

C1,C2是P1的子上下文。

C2用于从API写入。 以便将保存的更改快速传播到C1。

C1更改将传播到P1。 作为其子上下文。 传播速度很快,并且写入持久性存储的操作是在另一个上下文中进行的。 C1中的操作相当快。 这是建立3层架构的整体目标。 性能!

所有这些都不再需要设置。

NSPersistentContainer

iOS 10引入了新的NSPersistentContainer类,该类将建立3层架构的所有样板代码减少到下面几行。

  ...公共变量容器:NSPersistentContainer 
私人init(){
容器= NSPersistentContainer(名称:“模型”)
container.loadPersistentStores(completionHandler:{{_,error)在
如果让错误=错误{
fatalError(“未解决的错误\(错误)”)
}
})
}
...

而已。

容器提供了两种读写方式。

  1. viewContext属性
  2. performBackgroundTask方法

让我们添加一些便捷的方法来帮助您从容器中进行读取和写入。

 静态函数performBackgroundTask(_块:@转义(NSManagedObjectContext)->无效){ 
DataCoordinator.sharedInstance()。container.performBackgroundTask(block)
}

静态函数performViewTask(_ block:@escaping(NSManagedObjectContext)-> Void){block(DataCoordinator.sharedInstance()。container.viewContext)
}

阅读

阅读我们要做的就是

  DataCoordinator.performViewTask {(上下文) 
}

从线程工作时,请确保在使用此方法之前使用DispatchQueue.main.asyncDispatchQueue.main.sync

  DispatchQueue.main.async { 
DataCoordinator.performViewTask {(上下文)
}
}

写作

写我们要做的就是

  DataCoordinator.performBackgroundTask {(上下文) 
}

您可以在下面找到完整的代码。