UIDocument,NSFileWrapper和Images

时间:2012-06-11 16:17:53

标签: iphone cocoa-touch icloud uidocument nsfilewrapper

我有一个UIDocument,我想要包括(1)一个txt文件和(2)几个jpg图像。我将txt和所有jpgs放入NSFileWrapper。

当我加载UIDocument时,我需要txt文件中的信息非常快,所以我先加载它然后忽略所有图像直到我真正需要它们。

虽然我知道如何懒洋洋地加载图像,但我不确定如何“懒洋洋地”保存图像(特别是在使用iCloud时,我不希望文件被不必要地上传/下载)。假设我已经加载了所有图像并且没有更改它们。然后我想保存UIDocument,忽略所有图像(因为它们没有改变),但想要保存文本,因为它确实改变了。

我如何实现这一目标?它甚至可能吗?还是自动完成?或者我不应该把图像放在我的UIDocument中,并让每个图像由不同的UID文档处理?这对我来说有点混乱,我很害怕。

到目前为止,这是我的代码,它将保存所有图像和文本(无论它们是否被更改):


UIDocument

-(id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {

        NSMutableDictionary *wrappers = [NSMutableDictionary dictionary];
// the following puts a wrapper into a dictionary of wrappers:
        [self encodeObject:self.text toWrappers:wrappers toFileName:@"text.data"];
        [self encodeObject:self.photos toWrappers:wrappers toFileName:@"photos.data"];
        NSFileWrapper *fileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:wrappers];

        return fileWrapper;

    }

当我想保存UIDocument时:

[self.doc saveToURL:self.doc.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) {
    [self.doc closeWithCompletionHandler:^(BOOL success) {}];
}];

1 个答案:

答案 0 :(得分:3)

您应该在UIDocument实例中保留对NSFileWrapper的引用。这样,只会更改已更改的内容,而不是整个包装器。

因此,在加载文件时保留引用(或为新文档创建新文件):

- (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outError {
    // save wrapper:
    self.fileWrapper = (NSFileWrapper*)contents;

现在,如果您的文件实际发生了变化,您只需要更新包装器:

- (id)contentsForType:(NSString *)typeName error:(NSError **)outError {
    NSFileWrapper *subwrapper = [self.fileWrapper.wrappers objectForKey:@"subwrapper"];
    if(self.somethingChanged) {
        [self.fileWrapper.wrappers removeFileWrapper:subwrapper];
        subwrapper = [[NSFileWrapper alloc] initRegularFileWithContents:…

我知道代码非常简短,但我希望这有助于指出正确的方向。