我在我的应用程序中使用谷歌驱动器文件。访问文件,下载文件,上传文件都是一种魅力。现在,我正在尝试使用NSCoding将GTLDriveFile信息保存在本地(pList)上。你能帮我把这些信息保存到pList中,或者建议在本地存储这些信息的最佳方法吗
遵循的步骤:
请参阅此链接以获取 GTLDriveFile 类结构 https://developers.google.com/drive/ios/reference/ios-client/interface_g_t_l_drive_file
我试过这种方式,但我无法将整个结构保存到其中。
对于Ex:.h文件
#import "GTLDriveFile.h"
@interface sample : GTLDriveFile <NSCoding>
@end
.m文件
#import "sample.h"
@implementation sample
//@synthesize File;
- (id)initWithCoder:(NSCoder *)aDecoder
{
if(self = [super init]) {
super.fileSize=[aDecoder decodeObjectForKey:@"fileSize"];
super.originalFilename=[aDecoder decodeObjectForKey:@"originalFilename"];
super.mimeType=[aDecoder decodeObjectForKey:@"mimeType"];
super.title=[aDecoder decodeObjectForKey:@"title"];
**super.parents=[aDecoder decodeObjectForKey:@"parents"];**
super.lastModifyingUserName=[aDecoder decodeObjectForKey:@"lastModifyingUserName"];
**super.copyable=[aDecoder decodeObjectForKey:@"copyable"];**
super.kind=[aDecoder decodeObjectForKey:@"kind"];
super.writersCanShare=[aDecoder decodeObjectForKey:@"writersCanShare"];
**super.appDataContents=[aDecoder decodeObjectForKey:@"appDataContents"];
super.modifiedDate=[aDecoder decodeObjectForKey:@"modifiedDate"];**
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject: super.fileSize forKey:@"fileSize"];
[encoder encodeObject: super.originalFilename forKey:@"originalFilename"];
[encoder encodeObject: super.mimeType forKey:@"mimeType"];
[encoder encodeObject: super.title forKey:@"title"];
**[encoder encodeObject: super.parents forKey:@"parents"];**
[encoder encodeObject: super.lastModifyingUserName forKey:@"lastModifyingUserName"];
**[encoder encodeObject:copyable forKey:@"copyable"];**
[encoder encodeObject: super.kind forKey:@"kind"];
[encoder encodeObject: super.writersCanShare forKey:@"writersCanShare"];
**[encoder encodeObject:appDataContents forKey:@"appDataContents"];**
**[encoder encodeObject: super.modifiedDate forKey:@"modifiedDate"];**
}
@end
问题是,我无法序列化/反序列化NSString,NSNUMBER等直接值。当我尝试某些基础对象如“ copyable ”时,我就是获得异常(请参阅粗体对象或参考上面链接中的GTLDriveFile类参考)。
大家好,请帮我把这些信息保存到当地,并建议最好的方法。
由于
答案 0 :(得分:1)
所以Cocoa框架类支持NSCoding
。在这些类中,有些是“普通”类(如NSString
),它们支持所需的一切。有些是“复杂”类(如NSArray
),其中包含其他类的实例 - 在这种情况下,所有包含的对象必须支持NSCoding
才能使编码正常工作
您要编码/解码的任何非框架类,您需要指定它符合NSCoding
并且您需要编写协议方法的实现(如果合适,调用super
)
答案 1 :(得分:1)
在上面的一条评论中,您有效地建议了以下NSCoder
方法(显然假设您正在处理只有两个属性name
和array
)的对象:
- (id)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super init])) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.array = [aDecoder decodeObjectForKey:@"array"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeObject:self.array forKey:@"array"];
}
如果超类本身不符合NSCoder
,那基本上是正确的。但如果super
符合NSCoder
,那么你也必须给它机会施展它的魔力:
- (id)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.array = [aDecoder decodeObjectForKey:@"array"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
[super encodeWithCoder:encoder];
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeObject:self.array forKey:@"array"];
}
如果你是一个自定义对象的子类(例如,是GTLObject
还是你自己的一个类),那么使用它也很重要,这也符合NSCoder
。并且您必须在将包含在存档中的所有类中重复上述模式。但是Cocoa类(如NSArray
)已经符合NSCoder
,所以你只需要担心自己的类。