关于我:大厂摸鱼 + 业余独立开发,之后会输出深度技术文章 + 独立开发技巧

我的往期技术文章合集:RickeyBoy – Gitbub

我的独立开发 App:iColors – 设计创意 配色助手

上一篇:

独立开发之 App 国际化全步骤(一):为什么要做国际化

独立开发之 App 国际化全步骤(二):App 数据翻译

独立开发之 App 国际化全步骤(三):Core Data 模型晋级

‍♂️ Core Data 模型解析晋级

当 Core Data 数据模型晋级完毕之后,就意味着咱们的数据能够被顺利的导入到 App 之中了。不过这还不行,咱们在 App 中运用模型的相关代码,也要做必定的调整。

怎么手动解析 Core Data

现在我的 App 中运用的是手动解析 Core Data Model 的形式。这样虽然需求多一些额定的代码,可是优点是愈加直观可控,也能够添加一些核算特点等,提高代码的易用性和可读性。

那么怎么采用手动解析的办法呢?

  1. 咱们先选中 Core Data 的模型(咱们的例子中就是 Model 2 文件)
  2. 选中 Xcode 的 Tab Editor,然后 Create NSManagedObject subclass,选中对应的 Data Model 进行创立
  3. Xcode 会自动生成两个文件,别离为 xxxModel+CoreDataClassxxxModel+CoreDataProperties
  4. 留意,此刻 Data Model 对应的代码生成办法(Inspectors 面板中的 Codegen),应该选择 Manual,如下图所示

独立开发之 App 国际化全步骤(四):Core Data 模型解析

此刻,Core Data 就明白了,App 在解析模型时,会运用咱们手动生成和修正过的文件,也就是 xxxModel+CoreDataClassxxxModel+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 内的文案进行多语言。