2015-10-08 7 views
5
スウィフトを使用するときにアーカイブ解除しようとしたとき、私は次の例外を取得しています

をデコードすることはできません。「*** - [NSKeyedUnarchiver:キャッチされない例外により「NSInvalidUnarchiveOperationException」、理由にアプリを終了NSKeyedUnarchiverは、クラスのオブジェクトNSKnownKeysDictionary1

decodeObjectForKey:]:キー(NS.objects)のクラス(NSKnownKeysDictionary1)のオブジェクトをデコードできません。クラスはソースコードまたはリンクされていないライブラリで定義されている可能性があります。 '

コンテキスト:「共有リンク」拡張を作成しています。私の主なアプリ(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]; 

を配列が正しくアプリのグループフォルダに書き出される - 私が使用してそれを読むことができます別の拡張、目的Cで書かれたもの。

この例外は、シミュレータで実行したときに表示されます。コードは、32ビットデバイス(iPhone 5およびiPad 3)で実行したときに正しく動作するように、と表示されます。私は現在64ビットデバイスをテストしていません。

私はimportまたはフレームワークが欠けていると思いますが、どちらが1つですか?

+0

でdata' 'の形式は何ですかポイント 'NSKetedUnarchiver'が呼び出されますか?最初にファイルシステムに保存されて以来、値やクラス構造が変更されている可能性はありますか?これが問題であるかどうかは、派生データ/キャッシュのクリーニングによってわかります。 – ColinMasters

+0

'bookmarks' NSArrayをそのままNSKeyedArchiverに渡します。私はそのコードで私の質問を更新しました。 –

答えて

2

アップルデベロッパーフォーラムで、またアップルデベロッパーリレーションズからgot a good answer(一度限り)の質問を受けました。私は重要なビットを引用します:

NSKnownKeysDictionary1はわかりませんコアデータのブードーです。 ...明らかに、シリアライゼーションとデシリアライゼーションが正しく行われていません。ワームホール の両端にコアデータをアップして実行していますか?それにもかかわらず、ブックデータ配列の (Core データから戻ってくるもの)を深くコピーして、Core Dataの代わりに の標準の辞書を送るようにしてください。

私の解決方法は、コアデータフレームワークを拡張に追加するか、ディープコピーを行うことです。 (私は一時的に元をやった適切な解決策は、おそらく後者である。。)

+0

拡張機能にCore Dataフレームワークを追加するだけです:)。 –

4

これは単なるサイドノートである:

あなたは両方のNSKeyedArchiver & NSKeyedUnarchiverのためのクラス名を設定することができます。 私はCoreDataをまったく扱わずにこの問題を抱えていました。未舗装の人は自分のクラスをもう見つけられませんでした。

下図のように私のクラスのための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) 
関連する問題