关于我:大厂摸鱼 + 业余独立开发,之后会输出深度技术文章 + 独立开发技巧
我的往期技术文章合集: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
),注释我直接加载代码之中了,信任咱们应该能够看懂
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 的新特点。
不过明白了上面的代码之后,改动起来就非常简单了,只需求调整两个地方:
// 修正一行
private enum CodingKeys: String, CodingKey { case name, nameEn, hex }
// 新增一行
nameEn = try values.decode(String.self, forKey: .nameEn)
信任我不用做太多阐明,咱们也知道该怎么改了。与此同时,咱们能够在 ColorModel+CoreDataProperties
文件中,添加一个办法,用于做多语言的适配:
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 内的文案进行多语言。