簡體   English   中英

Core Data可用於保存Codable Struct嗎?

[英]Can Core Data be used to save a Codable Struct?

我正在努力學習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”結構的最佳解決方案嗎?

不是直接但有一些選擇。

我將介紹我正在使用的那個:

您可以在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顯示的相同。

Core Data使用NSManagedObjects或NSManagedObject的子類將數據存儲在其后備存儲中,通常是SQLite存儲。 NSManagedObject是一個類而不是結構,所以如果你想使用結構然后在Core Data中保存數據,你需要編寫一些代碼來將數據從結構復制到NSManagedObject。

Swift中的首選項是盡可能在類上使用結構,但是如果您正在使用Core Data,那么將數據定義為NSManagedObjects可能更有意義(並且可能使NSManagedObject子類可編碼 - 谷歌核心數據和cobable,你會找到一堆文章, 包括這一篇

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM