在SwiftUI 2.0和Xcode 12中使用CoreData
由donnywals于2020年7月20日发布
在Xcode 12中,您可以创建不再使用AppDelegate和SceneDelegate来管理应用程序生命周期的项目,通常我们在AppDelegate中集成Core Data,相关步骤可以参考《iOS开发从入门到精通》课程的第七章节。 现在我们可以使用Swift的新@main注释,将符合App协议的结构转换为应用程序的主入口点。
在Xcode 12中创建新项目时,可以选择对SwiftUI项目使用SwiftUI App应用程序生命周期。
尽管Xcode 12 beta 5引入了在创建新项目时在SwiftUI应用程序中包含Core Data的选项,但是您可能已有一个不使用Core Data的现有SwiftUI项目。另外,您可能会很好奇您如何在SwiftUI项目中手动集成Core Data,因为Apple提供的新Core Data模板并没有什么神奇之处。
将核心数据添加到SwiftUI项目只需两个小步骤:
- 将Core Data模型文件添加到您的项目
- 初始化NSPersistentContainer
将Core Data模型文件添加到您的项目
要将新的Core Data模型文件添加到您的项目中,请选择File-> New-> File(cmd + N),然后从文件类型选择器的Core Data部分中选择Data Model。
选择此名称后,为您的模型选择一个名称。 Xcode用来选择的默认名称是项目的名称,但是您可以选择任何想要的名称。
我个人通常会以我的项目名称为名,除了觉得熟悉之外,因为它是Xcode在较早的Xcode版本中会选择的默认名称。当前,Xcode会为您选择的默认名称是Model,这也是一个很好的名称。
这就是全部。现在,您的核心数据模型文件已添加到您的项目中,可供NSPersistentContainer使用。
初始化NSPersistentContainer
从iOS 10开始,推荐使用和管理Core Data堆栈的方法是通过NSPersistentContainer。当Xcode为您生成Core Data实现时,它也会使用NSPersistentContainer。您可以在任何需要的地方初始化NSPersistentContainer。我将向您展示如何在App结构中将其初始化为属性,但是您也可以在专用数据源对象中初始化NSPersistentContainer。我建议不要从View内部初始化NSPersistentContainer,但是可以这样做。请记住,尽管只应加载一次容器。
让我们看一下实例化NSPersistentContainer所需的代码:
struct MyApplication: App {let persistentContainer: NSPersistentContainer = {let container = NSPersistentContainer(name: "MyApplication")container.loadPersistentStores(completionHandler: { (storeDescription, error) inif let error = error as NSError? {fatalError("Unresolved error \(error), \(error.userInfo)")}})return container}()var body: some Scene {WindowGroup {Text("Hello, World!")}}
}
初始化持久性容器时,您要做的所有事情就是通过将模型名称传递给初始化程序来告诉它要加载哪个模型文件,然后在容器实例上调用loadPersistentStores。 完成此操作后,您的Core Data堆栈便已初始化并准备就绪。 在这里,您可以使用View中的@Environment属性包装器将容器的viewContext插入应用程序的环境中,也可以通过其他方式传递它。
请记住,您不必在App结构中初始化持久性容器。 您还可以创建一个PersistenceManager对象,例如:
class PersistenceManager {let persistentContainer: NSPersistentContainer = {let container = NSPersistentContainer(name: "MyApplication")container.loadPersistentStores(completionHandler: { (storeDescription, error) inif let error = error as NSError? {fatalError("Unresolved error \(error), \(error.userInfo)")}})return container}()
}struct MyApplication: App {let persistence = PersistenceManager()var body: some Scene {WindowGroup {Text("Hello, World!")}}
}
这将完全正常。
AppDelegate中生成的Core Data堆栈的旧版本包含一项额外功能,该功能可以在应用程序进入后台时自动保存所有更改。 您可以通过侦听NotificationCenter.default上的UIApplication.willResignActiveNotification来模仿此行为。
请注意,Apple的用于SwiftUI应用程序的新Core Data模板也缺少此自动保存功能。
不幸的是,我还没有找到一种从App结构中订阅此通知的方法,因为它是一个结构,并且使用基于闭包的侦听器抱怨访问持久性容器时捕获了一个可变的self参数。
解决此问题的最简单方法是在专门的PersistenceManager中进行订阅,就像我之前向您展示的那样:
class PersistenceManager {let persistentContainer: NSPersistentContainer = {let container = NSPersistentContainer(name: "MyApplication")container.loadPersistentStores(completionHandler: { (storeDescription, error) inif let error = error as NSError? {fatalError("Unresolved error \(error), \(error.userInfo)")}})return container}()init() {let center = NotificationCenter.defaultlet notification = UIApplication.willResignActiveNotificationcenter.addObserver(forName: notification, object: nil, queue: nil) { [weak self] _ inguard let self = self else { return }if self.persistentContainer.viewContext.hasChanges {try? self.persistentContainer.viewContext.save()}}}
}
这样一来,您应该拥有在SwiftUI 2.0应用程序中开始使用Core Data所需的所有信息。
总结
在本周的帖子中,我向您展示了如何从应用程序中的任何位置初始化Core Data,使您可以在SwiftUI 2.0的新应用程序生命周期中使用它。
您已经看到将核心数据添加到您的应用程序所需要做的全部工作,就是创建模型文件并初始化NSPersistentContainer对象。 它可以在您的应用程序中的任何位置运行,包括使用基于旧AppDelegate的应用程序生命周期的应用程序。
译自:https://www.donnywals.com/using-core-data-with-swiftui-2-0-and-xcode-12/
在SwiftUI 2.0和Xcode 12中使用CoreData相关推荐
- Xcode 12 GM发行说明,快来看看SwiftUI和Swift都更新哪些新技术吧
使用代码生成了词云大家可以看看 Xcode 12 GM发行说明 更新您的应用程序以使用新功能,并针对API更改测试您的应用程序. 总览 Xcode 12包括适用于iOS 14,iPad OS 14,t ...
- SwiftUI 4.0 中原生图表(Charts)实现超长内容滚动功能
功能需求 SwiftUI 4.0给我们带来了 iOS 16 中美美哒的原生图表(Charts). 不过,默认的 Charts 是将全部项目一起显示在视图中,如果图表中需要显示的数据很多,就会挤压在一起 ...
- Xcode 12 Beta 3 更新记录SwiftUI2
Xcode 12 Beta 3发行说明 更新您的应用程序以使用新功能,并针对API更改测试您的应用程序. 总览 Xcode 12 beta 3包括适用于iOS 14,iPad OS 14,tvOS 1 ...
- 全新设计的 Xcode 12
苹果在 WWDC 2020 上除了发布最新的 macOS Big Sur 之外,还宣布未来 Mac 将会采用基于 ARM 架构的自研芯片 Apple silicon.因此,苹果也推出了相应的集成开发环 ...
- 1.01的12次方怎么用计算机算,(1+0.5%)的12次方等于多少,CASIO计算器中怎样算
CASIO计算器中计算这个算式,与下面的方法基本相同: (1+0.5%)^12=1.0616778118644995687897076174316....... 方法与步骤如下: 步骤1.用计算器数字 ...
- 小米 mix 2s 12.0.1 稳定版 中阉割系统api
小米 mix 2s 12.0.1 稳定版 中阉割系统api 如果你在做全面UI适配的时候调用系统API getcutout like this : context.windowManager?.def ...
- 手欠升级 Xcode 12 导致 carthage 构建只包含 RxSwift 的 Cartfile 失败
手欠升级 Xcode 12 导致 carthage 构建只包含 RxSwift 的 Cartfile 失败 2020年9月16日 Apple 发布了 Xcode 12,前一个版本是 11.7,秉承了 ...
- 如何在Xcode 4中设置NSZombieEnabled?
如何在Xcode 4中为我的可执行文件设置NSZombieEnabled和CFZombieLevel ? #1楼 在Xcode 4.2中 项目名称/编辑方案/诊断/ 启用Zombie Objects复 ...
- matlab给0数组赋值,MATLAB中怎么把一个函数的一部分赋值给一个变量或数组,比如怎么把sin(x)大于0的部分赋值给f....
答:你可以编一个for循环么,判断sin(x)时候大于0,如果大于0 f=sin(x) 答:总体思路:设定筛选条件,将数组中符合条件的元素筛选出来(可以筛选出元素值也可以筛选出元素对应的下标),然后将 ...
最新文章
- 2022-2028年中国环卫行业产业链深度调研及投资前景预测报告
- RuntimeError: Found dtype Double but expected Float”
- 22个激活函数,ReLU、RReLU、LeakyReLU、PReLU、Sofplus、ELU、CELU、SELU、GELU、ReLU6、Sigmoid、Tanh、Softsign、Hardtanh等
- MKNetWorkKit使用方法
- 2019 .NET China Conf之我逛魔都
- 怎么把JSP的参数:先传到JSP中,然后传给后台
- java集合转js数值_前端js调用接口转换Map数组数据
- 仿淘宝分页按钮效果简单美观易使用的JS分页控件
- js关于两个字符串的加减乘除运算
- scp创建远程目录_如何在 HPC 硬件上远程运行大型仿真?
- 数据仓库专题(14)-数据仓库建设指导原则:一切以就绪数据为主
- Java中的DES加密与解密工具类
- linux回到桌面的命令符_Linux终端命令快捷键汇总
- ASA使用ASDM管理
- 华为设备IP路由表管理命令
- 如何强制卸载Google浏览器,不用担心Google打开为白板,亲测有效。
- 信息技术智库丨月度大考试
- 【数据结构】选择排序
- python默认数据转换_Python之数据转换
- Curious Array