我正努力学习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”结构的最佳解决方案吗?
答案 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:n
和n:n
花费更多的时间来完成,但是逻辑与UserManagedObject
上介绍的相同。
答案 1 :(得分:0)
核心数据使用NSManagedObjects或NSManagedObject的子类在其后备存储(通常是SQLite存储)中存储数据。 NSManagedObject是不是结构的类,因此,如果要使用结构然后将数据保存在Core Data中,则需要编写一些代码以将数据从结构复制到NSManagedObject。
Swift的首选项是在可能的情况下使用结构而不是类,但是如果您使用的是Core Data,则将数据定义为NSManagedObjects可能更有意义(并且可能使NSManagedObject子类可编码-谷歌核心数据以及cobable和您会发现很多文章including this one。