Как добавить пользовательский атрибут в Core Data с подключением к API? - PullRequest
0 голосов
/ 18 апреля 2020

Прежде всего, я не уверен, как правильно отформатировать заголовок вопроса.

Я пытаюсь добавить новый атрибут, скажем customNote, в модель Codable User, которая используется в Базовые данные и Rest API .

С помощью SO и некоторых подобных статей https://medium.com/@andrea.prearo / working-codable-and-core-data-83983e77198e я смог заставить его работать, однако без такого атрибута customNote.

Модель пользователя

import Foundation
import CoreData

@objc(User)
public class User: NSManagedObject, Codable {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<User> {
        return NSFetchRequest<User>(entityName: "User")
    }

    @NSManaged public var id: Int32
    @NSManaged public var name: String?

    enum CodingKeys: String, CodingKey {
        case id = "id"
        case name = "name"
    }

    required convenience public init(from decoder: Decoder) throws {
        guard let codingUserInfoKeyManagedObjectContext = CodingUserInfoKey.managedObjectContext,
            let managedObjectContext = decoder.userInfo[codingUserInfoKeyManagedObjectContext] as? NSManagedObjectContext,
            let entity = NSEntityDescription.entity(forEntityName: "User", in: managedObjectContext) else {
                fatalError("Failed to decode User")
        }

        self.init(entity: entity, insertInto: managedObjectContext)

        let values = try decoder.container(keyedBy: CodingKeys.self)
        id = try values.decodeIfPresent(Int32.self, forKey: .id) ?? 0
        name = try values.decodeIfPresent(String.self, forKey: .name)
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(id, forKey: .id)
        try container.encode(name, forKey: .name)
    }
}

Запрос

...
            do {
                guard let codingUserInfoKeyManagedObjectContext = CodingUserInfoKey.managedObjectContext else {
                    DispatchQueue.main.async {
                        completion(.failure(NSError(domain: "Error Core Data", code: 0, userInfo: nil)))
                    }

                    return
                }

                let managedObjectContext = CoreDataStack.shared.persistentContainer.viewContext
                let decoder = JSONDecoder()
                decoder.userInfo[codingUserInfoKeyManagedObjectContext] = managedObjectContext
                let result = try decoder.decode(ResponseType.self, from: responseData)

                DispatchQueue.main.async {
                    completion(.success(result))
                }
            } catch let error {
                DispatchQueue.main.async {
                    completion(.failure(error))
                }
            }
...

Вопрос в том, Опять же, как добавить пользовательский атрибут? Поскольку идея заключается в том, что customNote не следует менять во время API Call + Syn c на Core Data. customNote может быть добавлен или отредактирован и подключен к экземпляру user.

EDIT: customNote также сохраняется локально. Я подумываю сделать для этого новую сущность в Core Data.

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