【问题标题】:iCloud - How to save archive containing array of custom objectsiCloud - 如何保存包含自定义对象数组的存档
【发布时间】:2012-01-18 17:38:38
【问题描述】:

我开发了一个小应用程序,它通过归档一系列自定义对象来本地存储在 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 的字符串,在我的根视图控制器中,我有一个名为 list 的 NSMutableArray,我在其中添加了该 Snippet 类的每个新实例。

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

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

【问题讨论】:

    标签: ios sync icloud archiving custom-object


    【解决方案1】:

    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;
    

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

    【讨论】:

    • 感谢您的回答。因此,如果我理解正确,我可以将 + (NSData *)archivedDataWithRootObject:(id)rootObject 与数组一起使用,然后 - (id)contentsForType:(NSString *)typeName error:(NSError **)outError 将整个数组归档为 1 UIDocument 的单个实例
    • 在这种情况下你会如何声明 UIDocument ?
    • 我看不出你在说什么数组。我将在上面添加一个 sn-p 以提供帮助。
    • 我添加以澄清我对数组的含义
    • 如果你想添加一个数组,你可以使用-encodeObject:forKey:,就像你对字符串一样。只要确保数组中的所有对象都实现了 NSCoding。你真的应该阅读 Archives and Serializations Programming Guide -- 那里都有解释。
    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 2012-05-19
    • 2012-09-15
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多