Можно ли использовать JSONDecoder() вне init() для обновления атрибутов объекта?

Я создаю NSManagedObjects, используя Codable's jsondecode.decode([User].self, from: jsonDataRaw)но моя проблема в том, что decode.decode() каждый раз создает новый объект, но вместо этого мне нужен способ обновить существующие объекты с помощью jsonData, а не создавать новые.

Есть ли способ сделать это с помощью Codable?

class User : NSManagedObject, Codable {
   required convenience init(from decoder: Decoder) throws {

        guard let contextUserInfoKey = CodingUserInfoKey.context,
            let managedObjectContext = decoder.userInfo[contextUserInfoKey] as? NSManagedObjectContext,
            let entity = NSEntityDescription.entity(forEntityName: MERUser.entityName, in: managedObjectContext) else {
                fatalError("Failed to decode")
        }
        self.init(entity: entity, insertInto: managedObjectContext)
        try update(with: decoder)
    }

    func update(with decoder: Decoder) throws {

        // Decode
        guard let values = try? decoder.container(keyedBy: CodingKeys.self) else {
                assertionFailure("no decoder")
                return
        }
        self.id = (try values.decode(Int64.self, forKey: .id))
        if let value = try? values.decodeIfPresent(Int64.self, forKey: .currentPoint),
            let unwrappedValue = value {
            self.currentPoint = unwrappedValue
        }
    }

1 ответ

Похоже, что вы можете, но вам нужно немного закатать рукава. Стабильное ядро ​​имеет статью о том, как подойти к этому.

Из вступления:

Как бы ни были полезны эти протоколы, в них отсутствует одна функциональность, которая, на мой взгляд, довольно распространена при работе с удаленными службами: возможность обновлять существующий объект модели из данных. Создание этой функциональности - отличное упражнение для изучения Codable-протоколов и связанных с ними типов.

https://stablekernel.com/understanding-extending-swift-4-codable/

Другие вопросы по тегам