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

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

我的往期技术文章合集: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,如下图所示

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

相关推荐
Magnetic_h16 小时前
【iOS】单例模式
笔记·学习·ui·ios·单例模式·objective-c
归辞...18 小时前
「iOS」——单例模式
ios·单例模式·cocoa
humiaor19 小时前
Xcode报错:No exact matches in reference to static method ‘buildExpression‘
swiftui·xcode
yanling202320 小时前
黑神话悟空mac可以玩吗
macos·ios·crossove·crossove24
归辞...1 天前
「iOS」viewController的生命周期
ios·cocoa·xcode
crasowas1 天前
Flutter问题记录 - 适配Xcode 16和iOS 18
flutter·ios·xcode
2401_852403551 天前
Mac导入iPhone的照片怎么删除?快速方法讲解
macos·ios·iphone
SchneeDuan1 天前
iOS六大设计原则&&设计模式
ios·设计模式·cocoa·设计原则
JohnsonXin2 天前
【兼容性记录】video标签在 IOS 和 安卓中的问题
android·前端·css·ios·h5·兼容性
蒙娜丽宁2 天前
Go语言错误处理详解
ios·golang·go·xcode·go1.19