独立开发之 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 内的文案进行多语言。

相关推荐
明月看潮生6 小时前
青少年编程与数学 01-011 系统软件简介 07 iOS操作系统
ios·青少年编程·操作系统·系统软件
90后的晨仔8 小时前
RxSwift 框架解析
前端·ios
大熊猫侯佩12 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(五)
swiftui·swift·apple watch
大熊猫侯佩12 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(四)
数据库·swiftui·apple watch
可爱小仙子12 小时前
ios苹果系统,js 滑动屏幕、锚定无效
前端·javascript·ios
未来猫咪花13 小时前
# Flutter状态管理对比:view_model vs Riverpod
flutter·ios·android studio
咕噜企业签名分发-淼淼16 小时前
开发源码搭建一码双端应用分发平台教程:逐步分析注意事项
android·ios
键盘敲没电1 天前
【IOS】GCD学习
学习·ios·objective-c·xcode
SY.ZHOU1 天前
Significant Location Change
macos·ios·cocoa
MaoJiu1 天前
Flutter造轮子系列:flutter_permission_kit
flutter·swiftui