2015-10-08 3 views
5

Я получаю следующее исключение при попытке разархивировать при использовании Swift:NSKeyedUnarchiver не может декодировать объект класса NSKnownKeysDictionary1

Нагрузочного приложение из-за неперехваченное исключение «NSInvalidUnarchiveOperationException», причина: «*** - [NSKeyedUnarchiver decodeObjectForKey:]: невозможно декодировать объект класса (NSKnownKeysDictionary1) для ключа (NS.objects); класс может быть определен в исходном коде или в библиотеке, которая не связана '

Контекст: Я создаю расширение «Share Links». В моем основном приложении (написанном в Objective C) я выписываю массив словарей с информацией о ссылках с помощью MMWormhole.

NSFetchRequest* bookmarkFetch = [NSFetchRequest fetchRequestWithEntityName:@"XX"]; 
    bookmarkFetch.propertiesToFetch = @[ 
             @"name", @"text", @"date", @"url" 
             ]; 
    bookmarkFetch.resultType = NSDictionaryResultType; 
    NSArray* bookmarks = [moc executeFetchRequest:bookmarkFetch error:NULL]; 

    [wormhole passMessageObject:bookmarks identifier:@"XXX"]; 

Значения в массиве - это NSStrings и NSDate.

В недрах MMWormhole вы получите:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:messageObject]; 

messageObject просто массив закладок без промежуточной обработки.

В расширения у меня есть:

let wormhole = MMWormhole(applicationGroupIdentifier: "group.XX", optionalDirectory:nil) 
    let bookmarks = wormhole.messageWithIdentifier("XXX") as? Array<Dictionary<String,AnyObject>> 

messageWithIdentifier: заканчивается вызовом это в конечном счете:

id messageObject = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

Массив записывается в папку приложения группы правильно - я могу читать его с помощью другое расширение, одно из которых написано в Objective C.

Это исключение появляется при запуске в симуляторе. Код появляется для правильной работы при работе на 32-битном устройстве (iPhone 5 и iPad 3). В настоящее время у меня нет 64-битного устройства для тестирования.

Я предполагаю, что мне не хватает import или рамки, но какой (-ы)?

+0

Что такое формат 'data' на вызывается точка NSKetedUnarchiver'? Возможно ли изменение значений или структуры классов в коде, поскольку они сначала сохраняются в файловой системе? Очистка полученных данных/кэшей может рассказать вам, если это проблема. – ColinMasters

+0

Он просто передает NSK в NSKeyedArchiver. Я обновил свой вопрос с помощью этого кода. –

ответ

2

Я спросил об этом на форумах разработчиков Apple и (на этот раз) got a good answer от Apple Developer Relations. Я процитирую важные биты:

NSKnownKeysDictionary1 - это ядро, которое я не понимаю. ... Очевидно, что что-то не так с его сериализацией и десериализации. У вас есть Core Data up и работает на обоих концах червоточина? Независимо от того, имеет смысл сделать глубокий экземпляр вашего массива закладок (и все остальное, что вы вернетесь из Core данных), чтобы вы отправляли стандартные словари по «проводному» , а не материалам Core Data.

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

+0

Просто добавьте базовую структуру данных в расширение :). –

4

Это просто примечание стороны:

Вы можете установить имена классов и для NSKeyedArchiver & NSKeyedUnarchiver. У меня была эта проблема, не имея дело с CoreData. Unarchiver больше не нашел мой собственный класс.

Настройка по className для моего класса работает, как показано ниже:

Для archiver:

NSKeyedArchiver.setClassName("MyClass", for: MyClass.self) 
let data = NSKeyedArchiver.archivedData(withRootObject: root) 

И unarchiver:

NSKeyedUnarchiver.setClass(MyClass.self, forClassName: "MyClass") 
let root = NSKeyedUnarchiver.unarchiveObject(with: data) 
Смежные вопросы