iCloud - 如何保存包含自定义对象数组的存档

时间:2011-12-12 18:40:45

标签: ios sync icloud archiving custom-object

我开发了一个小型应用程序,通过归档包含以下内容的自定义对象数组在iOS中本地存储。

@property (nonatomic, copy) NSString    *name;
@property (nonatomic, copy) NSString    *dateCreated;
@property (nonatomic, copy) NSString    *desc;
@property (nonatomic, copy) NSString    *url;

我想使用iCloud同步所述存档,我相信推荐的机制是通过UIDocument子类。 我找到的所有UIDocument示例都使用了一个单独的NSString,因此我有点困惑如何同步整个自定义对象数组但使用UIDocument(就像我今天通过NSCoding本地做的那样)。

我是否应该创建一个包含上面列出的属性的UIDocument对象数组,我是否应该创建一个包含上述数据对象的1个实例的UIDocument实例,然后创建一个包含所有实例的数组,或者1个单个UIDocument是否包含完整的自定义对象数组?

我做了一些研究,但我仍然感到困惑。 最后,我需要同步一个包含所述自定义对象数组的文件。

提前感谢您的帮助

我今天拥有的是一个自定义类,如上所述,有4个名为Snippet的字符串,在我的Root视图中,我有一个名为list的NSMutableArray,我添加了该Snippet类的每个新实例。

self.list = [[NSMutableArray alloc] init];
Snippet *newEntry = [[Snippet alloc] init];
[self.list addObject:newEntry];

我应该创建一个拥有自定义对象数组的UI Document子类吗?

1 个答案:

答案 0 :(得分:2)

example in the docs确实显示了一个只有一个字符串的UIDocument子类,但它从-contentsForType:error:返回一个NSData。您可以使用NSKeyedArchiver在NSData中存储任意数量的对象。阅读Serializing Objects以了解如何使用NSKeyedArchiver对对象进行编码(并继续阅读以了解如何将其取回!)。

以您的房产为例......

@interface MyDocument : UIDocument
{
}
@property (nonatomic, copy) NSString    *name;
@property (nonatomic, copy) NSString    *dateCreated;
@property (nonatomic, copy) NSString    *desc;
@property (nonatomic, copy) NSString    *url;
@end

@implementation MyDocument

//...

- (id)contentsForType:(NSString *)typeName error:(NSError **)outError
{
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:name forKey:@"name"];
    [archiver encodeObject:dateCreated forKey:@"created"];
    [archiver encodeObject:desc forKey:@"desc"];
    [archiver encodeObject:url forKey:@"url"];
    [archiver finishEncoding];
    // release archiver if you're not using ARC
    return data;
}
@end;

警告:我没有编译上面的代码,所以没有保证。这应该作为一个示例来说明使用归档器将多个对象存储在单个数据对象中,您可以将其作为文档的内容返回。