Почему NSCoding не может декодировать объект после сохранения правильно? - PullRequest
0 голосов
/ 14 января 2020

Вот полный класс, который я сохраняю в данных ядра в качестве преобразуемого.

public class Item: NSObject, NSCoding {
    public var imageData: Data
    public var title: String
    public var keywords: [String]
    public var date: Date

    public init(imageData: Data, title: String, date: Date, keywords: [String])  {
        self.imageData = imageData
        self.title = title
        self.date = date
        self.keywords = keywords
        super.init()
    }

    public func encode(with coder: NSCoder) {
        coder.encode(imageData, forKey: "imageData")
        coder.encode(title, forKey: "title")
        coder.encode(keywords, forKey: "keywords")
        coder.encode(date.timeIntervalSince1970, forKey: "date")
    }

    public required convenience init?(coder: NSCoder) {
        self.init(
            imageData: (coder.value(forKey: "imageData") as? Data) ?? Data(),
            title: (coder.value(forKey: "title") as? String) ?? "",
            date: Date(timeIntervalSince1970: (coder.value(forKey: "date") as? TimeInterval) ?? Date().timeIntervalSince1970),
            keywords: coder.value(forKey: "keywords") as? [String] ?? [])
    }

}

Я могу успешно сохранить эти объекты в данных ядра, но когда я получаю эти объекты, происходит сбой в method -> publi c требуется удобство init? (кодер: NSCoder)

Поскольку кодировщик не может найти значение для ключа.

Вот ошибка Я получаю,

Завершение приложения из-за необработанного исключения 'NSUnknownKeyException', причина: '[valueForUndefinedKey:]: этот класс не совместим с кодировкой значения ключа для ключа imageData.

Я пробовал использовать другой преобразователь, я пытался создать свой собственный.

Я пытался сохранить его как двоичные данные, и я также попытался создать реляционную базу данных, но, похоже, ничего не работает.

Что-то я здесь не так делаю?

Спасибо!

1 Ответ

1 голос
/ 14 января 2020

Свойства, соответствующие кодированию значения ключа, должны быть помечены как @objc dynamic

@objcMembers
public class Item: NSObject, NSCoding {
    dynamic public var imageData: Data
    dynamic public var title: String
    dynamic public var keywords: [String]
    dynamic public var date: Date

...

@objcMembers - это глобальная директива для всех свойств

И вы должны использовать соответствующий API для расшифровать объекты

public required convenience init?(coder aDecoder: NSCoder) {
    self.init(
        imageData: (aDecoder.decodeObject(forKey: "imageData") as? Data) ?? Data(),
        title: (aDecoder.decodeObject(forKey: "title") as? String) ?? "",
        date: Date(timeIntervalSince1970: aDecoder.decodeDouble(forKey: "date")),
        keywords: aDecoder.decodeObject(forKey: "keywords") as? [String] ?? [])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...