在我的应用程序中,我有一个名为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发送。
另外!关于如何修复Deck编码以包含其“Tiles”数组的任何建议将不胜感激。
非常感谢!
纳德
答案 0 :(得分:0)
使用NSCoding协议。每个实体编码自身,然后自行解码。有点神奇,它是多么容易,随着应用程序的增长,人们可以将功能添加到对象图的新部分,而无需了解有关归档/归档或其格式的任何信息。
我在GitHub上有一个开源项目,可以很容易地从JSON进行NSCoding:JSONCoding。
以下是我开发之前的一些代码(单元测试之外):
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:firstDish];
RestaurantDish *retrievedDish = [NSKeyedUnarchiver unarchiveObjectWithData:data];
assertThat(retrievedDish.name, is(dishName));
实例firstDish只是一个代表一盘食物的实体菜。