良好的iOS核心数据堆栈
我当时正在编写一个新的仅限iOS 10+的核心数据堆栈,并认为我将展示该过程变得多么简单。
数据协调员
我真的很想让一个人来管理核心数据堆栈。 传统上总是调用此CoreDataManager。 现在,将其命名为DataCoordinator。
最终课程DataCoordinator {
私有静态var协调器:DataCoordinator?
公共类func sharedInstance()-> DataCoordinator {
如果协调员==无{
协调器= DataCoordinator()
}
返回协调员!
}
私人init(){
}
}
3层架构
TL; DR跳至下一部分。 这不再是必需的。
现在我们需要设置一个核心数据栈。 我们需要有2个堆栈或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(“未解决的错误\(错误)”)
}
})
}
...
而已。
容器提供了两种读写方式。
- viewContext属性
- performBackgroundTask方法
让我们添加一些便捷的方法来帮助您从容器中进行读取和写入。
静态函数performBackgroundTask(_块:@转义(NSManagedObjectContext)->无效){
DataCoordinator.sharedInstance()。container.performBackgroundTask(block)
}
静态函数performViewTask(_ block:@escaping(NSManagedObjectContext)-> Void){block(DataCoordinator.sharedInstance()。container.viewContext)
}
阅读
阅读我们要做的就是
DataCoordinator.performViewTask {(上下文)
}
从线程工作时,请确保在使用此方法之前使用DispatchQueue.main.async
或DispatchQueue.main.sync
。
DispatchQueue.main.async {
DataCoordinator.performViewTask {(上下文)
}
}
写作
写我们要做的就是
DataCoordinator.performBackgroundTask {(上下文)
}
您可以在下面找到完整的代码。