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

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

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

我想使用iCloud同步所述存档,我相信推荐的机制是通过UIDocument子类.
我找到的所有UIDocument示例都使用1个单独的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子类吗?

最佳答案
example in the docs确实显示了一个只有一个字符串的UIDocument子类,但它从-contentsForType返回一个NSData:error:.您可以使用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;

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

点赞