0

私のアプリケーションには、matchDataDictionary という辞書があり、次のように設定しています。

[[GCTurnBasedMatchHelper sharedInstance].matchDataDictionary setObject:deck forKey:@"deck"];

ここで、deck は Deck のインスタンスです: https://gist.github.com/naderhen/4711899

次に、次の方法でアーカイブ/アーカイブ解除をテストしようとしています:

アーカイブ(これはうまくいくようです):

NSMutableData *newData = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:newData];
[archiver encodeObject:[GCTurnBasedMatchHelper sharedInstance].matchDataDictionary forKey:@"root"];
[archiver finishEncoding];

NSLog(@"Archived Data: %@", newData);

アーカイブ解除 (機能しません):

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:newData];
NSMutableDictionary *matchDataDictionary = [unarchiver decodeObjectForKey:@"root"];
[unarchiver finishDecoding];

NSLog(@"Unarchived Data: %@", matchDataDictionary);

このデータを効果的にアーカイブし、その後アーカイブを解除する方法についてのガイダンスをいただければ幸いです。それが役立つ場合、これは GameKit フレームワークを使用したターンベースのゲームのためのものなので、現在の試合の matchData を介して送信するユーザー アクションを準備しようとしています。

また!「Tiles」配列を含めるように Deck エンコーディングを修正する方法についてのアドバイスをいただければ幸いです。

本当にありがとう!

ネーダー

4

1 に答える 1

0

NSCoding プロトコルを使用します。各エンティティは、自分自身をエンコードしてからデコードします。魔法のように簡単で、アプリが成長するにつれて、アーカイバー/アンアーカイバーやそのフォーマットについて何も知らなくても、オブジェクト グラフの新しい部分に機能を追加できます。

NSCoding プロトコル

GitHub に、JSON との間で NSCoding を簡単に実行できるオープン ソース プロジェクトがあります: JSONCoding

これは、私がそれを開発する前のコードです(単体テストから):

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:firstDish];
RestaurantDish *retrievedDish = [NSKeyedUnarchiver unarchiveObjectWithData:data];
assertThat(retrievedDish.name, is(dishName));   

インスタンス firstDish は、一皿の料理を表す単なるエンティティ Dish です。

于 2013-02-05T03:31:39.710 に答える