Могут ли базовые данные использоваться для сохранения Codable Struct? - PullRequest
0 голосов
/ 17 апреля 2019

Я борюсь с изучением Core Data, и мне было интересно, можно ли вообще сохранить структуру, соответствующую протоколу Codable, в Core Data?По сути, есть основная структура, называемая «Истории», которая также связана с другими структурами.

Базовая структура моей модели:

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 голосов
/ 18 апреля 2019

Базовые данные используют NSManagedObjects или подклассы NSManagedObject для хранения данных в своем резервном хранилище, обычно хранилище SQLite.NSManagedObject - это класс, а не структура, поэтому, если вы хотите использовать структуры и затем сохранять данные в Core Data, вам нужно написать некоторый код для копирования данных из структуры в NSManagedObject.

Предпочтение в Swift состоит в том, чтобы по возможности использовать структуры над классами, но если вы работаете с Базовыми данными, может иметь смысл определять ваши данные как NSManagedObjects (и, возможно, сделать подкласс NSManagedObject кодируемым - основные данные Googleи cobable, и вы найдете кучу статей , включая эту .

0 голосов
/ 17 апреля 2019

Не напрямую, но есть некоторые варианты.

Я представлю тот, который я использую:

Вы можете создать модель в CoreData, аналогичную вашей структуре, с суффиксом ManagedObject (физически его ManagedObject выглядит какон используется только CoreData), затем вы можете расширить настоящий ManagedObject и сохранить там свою структуру.

Расширение для пользователя должно выглядеть следующим образом:

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
        }
    }
}

Это решение предполагает, что вы сначала создадите модели ManagedObject в CoreData.Вы также можете настроить отношения 1:n и n:n, это займет больше времени, но логика та же, что и в UserManagedObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...