Как разархивировать пользовательский объект в нечто отличное от пользовательского класса в Swift - PullRequest
0 голосов
/ 04 июля 2018

У меня есть объект, где мы использовали NSKeyedArchiver для архивирования как класс Foo

Затем я изменил имя цели с Apple на Orange. И это пошло в производство, и пользователи начали падать при запуске. Но не все. И журналы указывают на NSKeyedUnarchiver

Я взял и взял заархивированный файл Foo, когда цель называлась Apple и когда она называлась Orange, и конвертировалась в xml, чтобы я могла ее прочитать. Основное и единственное отличие (я думаю) состоит в том, что клавиша classname равна Apple.Foo и Orange.Foo соответственно.

Как получить один из архивных файлов и проверить его имя в заархивированном классе?

Если я сделаю NSKeyedUnarchiver.unarchiveObject(withFile: path) as? Foo, он рухнет.

В идеале я бы так что-то вроде:

let object = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? [String : Any] 
let name = object!["classname"]!
if name == "Apple.Foo" {
    //delete the cache and let it rebuild
}

Но, очевидно, это не работает так. Любые идеи о том, как я могу проверить, что у меня есть поврежденный файл и удалить его без сбоя приложения?

Спасибо за помощь!

1 Ответ

0 голосов
/ 06 июля 2018

За последние несколько дней я узнал, что вы можете установить два разных имени класса для разархиватора одновременно, и они оба будут работать:

NSKeyedUnarchiver.setClass(Foo.classForKeyedUnarchiver(), forClassName: "Apple.Foo")
NSKeyedUnarchiver.setClass(Foo.classForKeyedUnarchiver(), forClassName: "Orange.Foo")

Теперь не имеет значения, какое имя класса в действительности имеется у файла на момент разархивирования.

...