使用 NSCoder 编码 NSArray 或 NSDictionary

Posted

技术标签:

【中文标题】使用 NSCoder 编码 NSArray 或 NSDictionary【英文标题】:Encode NSArray or NSDictionary using NSCoder 【发布时间】:2011-01-14 15:29:57 【问题描述】:

我想知道是否可以使用 NSCoder 方法:

- (void)encodeObject:(id)objv forKey:(NSString *)key

对 NSArray 或 NSDictionary 的实例进行编码。如果不是,您将如何对它们进行编码?我正在尝试使用 NSKeyedArchived / NSKeyedUnarchiver 在使用 GameKit 的手机之间发送数据。我试过了,似乎无法检索存储在数组中的字符串。我制作的数据包类与数据包类型整数一起出现,但不是数组中的数据。

提前致谢!

【问题讨论】:

这是一个自定义的 NSManagedObject.... 我想我必须为此使用 XML 或 JSON,但我需要学习如何 D: 【参考方案1】:

如果数组或字典是你应该做的根对象

NSData * encodedData = [NSKeyedArchiver archivedDataWithRootObject:someArray];

BOOL success = [NSKeyedArchiver archiveRootObject:someArray toFile:filePath];

如果是自定义类的实例变量,在-encodeWithCoder:方法中应该这样做

[coder encodeObject:someArray forKey:@"someArray"];

然后在-initWithCoder:方法中

someArray = [[coder decodeObjectForKey:@"someArray"] retain];

【讨论】:

【参考方案2】:

你在数组中存储什么样的对象?确保存储在数组中的所有对象都实现了 NSCoding 协议。

【讨论】:

【参考方案3】:

NSKeyedArchiver/Unarchiver 应该可以毫无问题地对 NSArrays 和 NSDictionaries 进行编码和解码。如果您创建的数据包类实现了 NSCoding 协议,则需要在您的 -encodeWithCoder: 方法中显式调用 [encodeObject:myNsArrayforKey:@"stringsArray"](假设 myNsArray 是您要编码的数据包对象中的实例变量的名称)。但是归档器和 NSArray 应该负责其余的工作。如果您正在这样做,那么了解更多关于您的类的布局以及编码/解码时谁在调用谁会很有帮助。

【讨论】:

以上是关于使用 NSCoder 编码 NSArray 或 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章

编码对象

什么时候在 UIView 或 UIViewController 上调用“required init?(coder aDecoder: NSCoder)”?

我应该在这里使用awakeFromNib还是initWithCoder?

iOS-NSCoder 和 NSCoding

获取当前邮政编码,并显示来自 NSArray 的最接近的结果

使用 NSCoder 进行视图之间的恢复 (viewWillAppear / viewWillDisappear)