Прежде всего, я не уверен, как правильно отформатировать заголовок вопроса.
Я пытаюсь добавить новый атрибут, скажем 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.