【问题标题】:Can Core Data be used to save a Codable Struct?可以使用 Core Data 来保存 Codable Struct 吗?
【发布时间】:2019-04-17 18:30:29
【问题描述】:

我正在努力学习 Core Data,想知道是否有可能将遵守 Codable 协议的结构保存到 Core Data?本质上,有一个名为“Stories”的主结构也链接到其他结构。

我的模型的基本结构是:

class GetStories : Codable {

typealias NetworkResponse = (Data?, Error?)->Void
typealias ReadyToSave = ()->Void
typealias RefreshTableView = ()->Void

// MARK: - Instance variables
var dataReturnedByServer : Data?
var stories : Stories?
var delegate: GetStoriesDelegate?  // the delegate stops becoming nil when you assign it as the delegate for ViewController.swift
var coverImages : [UIImage]?

// MARK: - Structs
struct Stories : Codable {
    let userStories : [Story]
    let nextURL : URL
    enum CodingKeys: String, CodingKey {
        case userStories = "stories"
        case nextURL = "nextUrl"
    }
}
struct User : Codable {
    let userName : String
    let userAvatar : String
    let userFullName : String
    enum CodingKeys : String, CodingKey{
        case userName = "name"
        case userAvatar = "avatar"
        case userFullName = "fullname"
    }
}
struct Story : Codable {
    let storyID : String
    let storyTitle : String
    let storyUser : User
    let storyCoverImageURL : String
    enum CodingKeys : String, CodingKey{
        case storyID = "id"
        case storyTitle = "title"
        case storyUser = "user"
        case storyCoverImageURL = "cover"
    }
}

... 然后还有一些其他的功能。

根据我的阅读,需要将结构本身转换为类,以便它们可以从 NSManagedObject 派生。这是使用 Core Data 保存“Stories”结构的最佳解决方案吗?

【问题讨论】:

标签: ios swift xcode core-data


【解决方案1】:

不是直接的,但有一些选择。

我将介绍我正在使用的那个:

您可以在 CoreData 中创建类似于带有后缀 ManagedObject 的结构的模型(实际上是它的 ManagedObject,因为它仅由 CoreData 使用),然后您可以扩展实际的 ManagedObject 并将您的结构存储在那里。

User 的扩展名应如下所示:

struct User : Codable {
    let userName : String
    let userAvatar : String
    let userFullName : String
}

extension UserManagedObject {
    var model: User {
        get {
            return User(userName: userName!, userAvatar: userAvatar!, userFullName: userFullName!)
        }
        set {
            self.userName = newValue.userName
            self.userAvatar = newValue.userAvatar
            self.userFullName = newValue.userFullName
        }
    }
}

此解决方案希望您首先在 CoreData 中创建 ManagedObject 模型。你也可以建立1:nn:n 的关系,它只是需要更多的时间来完成,但逻辑与UserManagedObject 上的相同。

【讨论】:

    【解决方案2】:

    Core Data 使用 NSManagedObjects 或 NSManagedObject 的子类将数据存储在其后备存储中,通常是 SQLite 存储。 NSManagedObject 是一个类而不是结构,所以如果你想使用结构然后将数据保存在 Core Data 中,你需要编写一些代码来将数据从结构复制到 NSManagedObject。

    Swift 中的偏好是在可能的情况下使用结构而不是类,但如果您正在使用 Core Data,将数据定义为 NSManagedObjects 可能更有意义(并且可能使 NSManagedObject 子类可编码 - google core data 和 cobable 和你会发现一堆文章including this one

    【讨论】:

      猜你喜欢
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多