可以使用核心数据来保存可编码结构吗?

时间:2019-04-17 18:30:29

标签: ios swift xcode core-data

我正努力学习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”结构的最佳解决方案吗?

2 个答案:

答案 0 :(得分:0)

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

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

您可以在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上介绍的相同。

答案 1 :(得分:0)

核心数据使用NSManagedObjects或NSManagedObject的子类在其后备存储(通常是SQLite存储)中存储数据。 NSManagedObject是不是结构的类,因此,如果要使用结构然后将数据保存在Core Data中,则需要编写一些代码以将数据从结构复制到NSManagedObject。

Swift的首选项是在可能的情况下使用结构而不是类,但是如果您使用的是Core Data,则将数据定义为NSManagedObjects可能更有意义(并且可能使NSManagedObject子类可编码-谷歌核心数据以及cobable和您会发现很多文章including this one