【问题标题】:Errors with Archiving / Unarchiving NSMutableDictionary归档/取消归档 NSMutableDictionary 的错误
【发布时间】:2013-02-05 03:27:10
【问题描述】:

在我的应用程序中,我有一个名为 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”数组的建议将不胜感激。

非常感谢!

纳德

【问题讨论】:

  • 是的,它似乎打破了并把我带到了以下:i.imgur.com/Mmr7Tuj.png
  • 在您的代码中,initWithCoder 调用父级的init,尝试将其更改为[self init]
  • 如果我将其更改为 (self = [self init]),我会遇到同样的问题

标签: ios objective-c ios6 nskeyedarchiver


【解决方案1】:

使用 NSCoding 协议。每个实体对自己进行编码,然后对自己进行解码。有点神奇,它是多么简单,随着应用程序的发展,人们可以将功能添加到对象图的新部分,而无需了解存档器/取消存档器或其格式。

NSCoding Protocol

我在 GitHub 上有一个开源项目,可以轻松地对 JSON 进行 NSCoding/从 JSON 进行 NSCoding:JSONCoding

这是我开发之前的一些代码(来自单元测试):

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

实例 firstDish 只是表示一盘食物的实体 Dish。

【讨论】:

  • 我是否错误地实现了 NSCoding 协议(在上述要点中)?我有 initWithCoder 和 encodeWithCoder 但也许他们错了
  • 您在字典中的自定义对象应符合NSCoding Protocol
  • 我认为是?实现了它的两个功能,并在头文件中添加了。要点:gist.github.com/naderhen/4711899
  • 你的实现看起来不错,但我认为你不应该在存档器中玩弄树节点,看看我自己的一些代码......
  • 您没有对对象进行编码。您应该将日志语句放在您的 encode/initWithCoder 中。他们肯定不会被叫到。
猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多