Ios 是否可以在init()之外使用JSONDecoder()来更新对象';s属性?
我正在使用Codable的Ios 是否可以在init()之外使用JSONDecoder()来更新对象';s属性?,ios,swift,core-data,codable,Ios,Swift,Core Data,Codable,我正在使用Codable的jsondecode.decode([User].self,from:jsonDataRaw)创建NSManagedObject 但我的问题是decode.decode()每次都会创建一个新对象,但我需要一种用jsonData更新现有对象的方法,而不是创建新对象 有没有一种方法可以使用Codable实现这一点 class User : NSManagedObject, Codable { required convenience init(from decoder
jsondecode.decode([User].self,from:jsonDataRaw)创建NSManagedObject
但我的问题是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
}
}
看起来你可以,但你需要把袖子卷起来一点。Stable Kernel有一篇关于如何实现这一点的文章 从介绍中: 尽管这些协议非常有用,但它们缺少一项我发现在使用远程服务时非常常见的功能:从数据更新现有模型对象的能力。构建此功能是探索可编码协议和相关类型的一个很好的练习
您似乎已经开始使用
update
函数,这有什么问题?@DávidPásztor我认为问题在于如何从init
之外的任何地方调用update
。例如,如果您从服务器API获得了新的JSON,并且希望就地更新现有对象,而不是创建新实例。@DávidPásztor,Tom Harrington说的是正确的,我找不到一种方法来使用解码器更新对象,而不是创建新对象。