关于我:大厂摸鱼 + 业余独立开发,之后会输出深度技术文章 + 独立开发技巧
我的往期技术文章合集:RickeyBoy - Gitbub
我的独立开发 App:iColors - 设计灵感 配色助手
上一篇:
🕵🏻♂️ Core Data 模型解析升级
当 Core Data 数据模型升级完毕之后,就意味着我们的数据可以被顺利的导入到 App 之中了。不过这还不够,我们在 App 中使用模型的相关代码,也要做一定的调整。
如何手动解析 Core Data
目前我的 App 中使用的是手动解析 Core Data Model 的模式。这样虽然需要多一些额外的代码,但是好处是更加直观可控,也可以增加一些计算属性等,提高代码的易用性和可读性。
那么如何采用手动解析的方法呢?
- 我们先选中 Core Data 的模型(我们的例子中就是 Model 2 文件)
- 选中 Xcode 的 Tab
Editor
,然后Create NSManagedObject subclass
,选中对应的 Data Model 进行创建 - Xcode 会自动生成两个文件,分别为
xxxModel+CoreDataClass
和xxxModel+CoreDataProperties
- 注意,此时 Data Model 对应的代码生成方式(Inspectors 面板中的 Codegen),应该选择 Manual,如下图所示
此时,Core Data 就明白了,App 在解析模型时,会使用我们手动生成和修改过的文件,也就是 xxxModel+CoreDataClass
和 xxxModel+CoreDataProperties
这两个。
那么,这两个文件应该如何去实现呢?其实主要是 xxxModel+CoreDataClass
文件,是需要声明属性的。而xxxModel+CoreDataProperties
通常上使用自动生成的部分基本就够了。
我这里直接上代码,首先是 xxxModel+CoreDataClass
(其实就是 ColorModel+CoreDataClass
),注释我直接加载代码之中了,相信大家应该能够看懂
Swift
import CoreData
public class ColorModel: NSManagedObject, Decodable {
// 通过 enum 声明需要解析的属性名称
private enum CodingKeys: String, CodingKey { case name, hex }
// 初始化方法,用于解码和初始化ColorModel对象
required convenience public init(from decoder: Decoder) throws {
// 获取上下文对象
guard let context = decoder.userInfo[.context] as? NSManagedObjectContext else { fatalError("NSManagedObjectContext is missing") }
// 获取ColorModel对应的 entity
guard let entity = NSEntityDescription.entity(forEntityName: "ColorModel", in: context) else { fatalError("Wrong entity name") }
// 初始化
self.init(entity: entity, insertInto: context)
// 解码,获取所有参数信息,并依次解析
let values = try decoder.container(keyedBy: CodingKeys.self)
name = try values.decode(String.self, forKey: .name)
hexString = try values.decode(String.self.self, forKey: .hex)
}
}
这段代码解析了 ColorModel,可以看到他有两个属性,分别解析了 name 和 hex 两个字符串类型的参数。
手动解析 Core Data:适配更新后的模型
相信通过上面的代码逻辑,我们不难看出,模型升级后,对应的手动解析文件也需要修改。当 Model 升级为了 Model 2 之后,ColorModel 除了 name 和 hex,还新增了一个 nameEn 的新属性。
不过明白了上面的代码之后,改动起来就非常简单了,只需要调整两个地方:
Swift
// 修改一行
private enum CodingKeys: String, CodingKey { case name, nameEn, hex }
// 新增一行
nameEn = try values.decode(String.self, forKey: .nameEn)
相信我不用做太多说明,大家也知道该怎么改了。与此同时,我们可以在 ColorModel+CoreDataProperties
文件中,增加一个方法,用于做多语言的适配:
Swift
func localizedName(_ locale: Locale) -> String {
if locale.isEnglish { // 这里 isEnglish 的判断如何实现,我后面会再详细讲解
return nameEn
} else {
return name
}
}
Tips:如何查看 Core Data 数据
在对 Core Data 进行修改的过程中,我们不免涉及到一些需要调试的时候。此时我们如果有一个方法能够直接看到 Core Data 数据库中的数据情况就好了。
关于这一点,可以分享一个在 stack overflow 上面看到的神奇操作:How can I check what is stored in my Core Data Database?
国际化系列文章的第四篇,在 Core Data 模型升级了之后,对应的模型解析代码也需要进行调整,所以本篇也简单讲了一下如何对 Core Data 模型进行手动解析,以及升级了模型之后如何调整手动解析的文件。 下一篇开始,会讲解如何对 App 内的文案进行多语言。