[英]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:n
和n: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.