【发布时间】:2018-01-11 15:17:31
【问题描述】:
我正在使用 Codable 的 jsondecode.decode([User].self, from: jsonDataRaw) 创建 NSManagedObjects
但我的问题是 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
}
}
【问题讨论】:
-
看来你已经开始研究
update函数了,这是怎么回事? -
@DávidPásztor 我认为问题在于如何从
init以外的任何地方调用update。就像您从服务器 API 获得新的 JSON 并且想要就地更新现有对象而不是创建新实例一样。 -
@DávidPásztor,Tom Harrington 说的是对的,我找不到用解码器更新对象而不是创建新对象的方法。
标签: ios swift core-data codable