使用 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:
myNsArray
forKey:@"stringsArray"]
(假设 myNsArray 是您要编码的数据包对象中的实例变量的名称)。但是归档器和 NSArray 应该负责其余的工作。如果您正在这样做,那么了解更多关于您的类的布局以及编码/解码时谁在调用谁会很有帮助。
【讨论】:
以上是关于使用 NSCoder 编码 NSArray 或 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章
什么时候在 UIView 或 UIViewController 上调用“required init?(coder aDecoder: NSCoder)”?
我应该在这里使用awakeFromNib还是initWithCoder?