是否可以在init()外部使用JSONDecoder()来更新对象的属性?

时间:2018-01-11 15:17:32

标签: ios swift core-data codable

我正在使用Codable jsondecode.decode([User].self, from: jsonDataRaw)创建NSManagedObjects 但我的问题是decode.decode()每次都会创建一个新对象,但我需要一种方法来使用jsonData更新exising对象,而不是创建新对象。

有没有办法用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 个答案:

答案 0 :(得分:2)

看起来你可以,但你需要稍微卷起袖子。 Stable Kernel有一篇关于如何处理这个问题的文章。

来自简介:

  

与这些协议一样有用,它们缺少我在使用远程服务时非常常见的一项功能:从数据更新现有模型对象的能力。构建此功能是探索Codable协议和相关类型的一个很好的练习。

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