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

相关推荐
美狐美颜SDK开放平台14 小时前
多场景美颜SDK解决方案:直播APP(iOS/安卓)开发接入详解
android·人工智能·ios·音视频·美颜sdk·第三方美颜sdk·短视频美颜sdk
wuxianda103016 小时前
苹果App上架4.3a被拒解决方案汇报总结
ios·uni-app·objective-c·cocoa·苹果上架·4.3a
SameX21 小时前
用 SpriteKit 做了个存钱罐 App,30 枚硬币同时掉帧率直接崩了
ios
for_ever_love__21 小时前
UI学习:单例传值
学习·ui·ios·objective-c
for_ever_love__21 小时前
UI学习:通知传值
学习·ui·ios·objective-c
2501_915106321 天前
在Mac上搭建iOS开发环境的详细步骤与注意事项
ide·vscode·macos·ios·个人开发·swift·敏捷流程
想个名字想老半天1 天前
uni 离线打包 ios,适用于自定义 ios系统最低适配 保姆级教程
macos·ios·cocoa
No Silver Bullet1 天前
iOS开发进阶(二十四):一文读懂iOS发布证书,描述文件到期后,在工程中如何进行替换
ios
库奇噜啦呼1 天前
【iOS】源码学习-类与对象底层原理
学习·ios·cocoa