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

相关推荐
DisonTangor15 小时前
苹果发布iOS 18.2首个公测版:Siri接入ChatGPT、iPhone 16拍照按钮有用了
ios·chatgpt·iphone
- 羊羊不超越 -15 小时前
App渠道来源追踪方案全面分析(iOS/Android/鸿蒙)
android·ios·harmonyos
2401_865854881 天前
iOS应用想要下载到手机上只能苹果签名吗?
后端·ios·iphone
HackerTom2 天前
iOS用rime且导入自制输入方案
ios·iphone·rime
良技漫谈2 天前
Rust移动开发:Rust在iOS端集成使用介绍
后端·程序人生·ios·rust·objective-c·swift
2401_852403552 天前
高效管理iPhone存储:苹果手机怎么删除相似照片
ios·智能手机·iphone
星际码仔2 天前
【动画图解】是怎样的方法,能被称作是 Flutter Widget 系统的核心?
android·flutter·ios
emperinter2 天前
WordCloudStudio:AI生成模版为您的文字云创意赋能 !
图像处理·人工智能·macos·ios·信息可视化·iphone
关键帧Keyframe2 天前
音视频面试题集锦第 8 期
ios·音视频开发·客户端
pb82 天前
引入最新fluwx2.5.4的时候报错
flutter·ios