Как сделать NSKeyedUnarchiver.unarchiveObject - PullRequest
0 голосов
/ 04 мая 2019

У меня есть рабочий код, который работает, но не рекомендуется:

Эта часть в порядке:

 let archived = try? NSKeyedArchiver.archivedData(withRootObject: [defaultRecord] as NSArray, requiringSecureCoding: false)

Это устарело:

 let records = NSKeyedUnarchiver.unarchiveObject(with: unarchivedObject as Data) as? [Record]

'unarchiveObject (with :) 'устарел в iOS 12.0: использовать + unarchivedObjectOfClass: fromData: error: вместо

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

Какой-нибудь рабочий пример этого?

1 Ответ

2 голосов
/ 04 мая 2019

Использование нового API для архивации массива немного сложно.

Вы могли бы понять это сами, если бы не игнорировали ошибки с try? ?

Чтобы иметь возможность декодировать массив пользовательского класса с помощью unarchivedObject(ofClass:from:, необходимо использовать множественное число форма unarchivedObject(ofClasses:from: и указать как NSArray (!), Так и пользовательский класс. Далее ваш класс должен принять NSSecureCoding

class Record : NSObject, NSSecureCoding {

   static var supportsSecureCoding: Bool {
        return true
    }

....

do {
    let archived = try NSKeyedArchiver.archivedData(withRootObject: [defaultRecord], requiringSecureCoding: false)

    let records = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSArray.self, Record.self], from: archived) as! [Record]
    print(records)
} catch { print(error) }

Но почему вы архивируете defaultRecord как массив вообще? Если вы заархивировали один объект, вы можете оставить свой класс таким, какой он есть, и написать

do {
    let archived = try NSKeyedArchiver.archivedData(withRootObject: defaultRecord, requiringSecureCoding: false)

    let record = try NSKeyedUnarchiver.unarchivedObject(ofClass: Record.self, from: archived)
    let records = [record]
    print(records)
} catch { print(error) }

Примечание: попробуйте сериализовать класс с Codable. Он быстрее и не требует наследования от NSObject.

...