如何减慢UIDocument的初始loadFromContents:ofType:error:?

时间:2012-06-21 20:13:36

标签: ios uidocument

当我将文件包从Finder拖到iTunes.app文件共享窗格中时,我的UIDocument类正在尝试读取相关的文件包装器,看起来我的代码读取它的执行速度比iTunes.app可以复制的速度快内容结束。初始文件包装器数组只包含包装器中的两个文件之一。

那么如何“减慢”我的代码呢?

我使用performSelector运行了一个测试:withObject:AfterDelay:1.0f,并且工作正常,但这感觉真的很冒险:如果一个非常大的文件被拖入iTunes(如果真的很大,我的意思是超出我的延迟) )?如果多个文件同时全部丢弃怎么办?

我看着以某种方式辨别该文件已准备好被阅读,但Apple的NSFileManager文档说

  

“尝试操作(例如加载文件或文件)要好得多   创建目录),检查错误,并处理这些错误   优雅地比试图提前弄清楚是否   操作会成功。“

但是,在解决组成文件包装器的过程中出现的时序问题,那么如何“优雅地”处理它就是在逃避我。

我的包文件中有两个数据文件(在这个早期阶段,但设计是因为会有更多):data.dat和info.dat。当我第一次使用代码工作到可以将文件拖到iTunes.app并在我的视图控制器中注意它时,data.dat始终解码正常,但找不到info.dat。一旦文件在我的本地文档文件夹中,视图控制器就会按预期显示所有数据(即info.dat在文件包装器内并正确形成)。怀疑这是一个计时问题,我将文件名常量和磁盘文件重命名为zdata.dat和ainfo.dat - 确定:ainfo.dat加载,我的UIDocument子类抱怨找不到zdata.dat。 / p>

我使用延迟加载,但视图控制器对info.dat内容有直接的兴趣,因此延迟加载对于iTu​​nes来说不够懒惰以进行复制!

从我的UIDocument子类实现:

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

    // Lazy load everything!

    _data = nil;
    _metadata = nil;

    return YES;
}

- (id)decodeObjectFromWrapperWithPreferredFilename:(NSString *)preferredFilename
{
    NSFileWrapper *fw = [self.fileWrapper.fileWrappers objectForKey:preferredFilename];
    if (!fw) {
        NSLog(@"Unexpected error: Couldn't find %@ in the file wrapper for %@", preferredFilename, self.fileURL);
        return nil;
    }
    NSData *data = [fw regularFileContents];
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

    return [unarchiver decodeObjectForKey:@"data"];
}

- (GSBMetadata *)metadata
{
    if (_metadata == nil) {
        if (self.fileWrapper != nil) {
           // NSLog(@"Loading metadata for %@...",self.fileURL);
            _metadata = [self decodeObjectFromWrapperWithPreferredFilename:kGSBMetadataFileName];
        } else {
            _metadata = [[GSBMetadata alloc] init];
        }
    }
    return _metadata;
}

在decodeObjectFromWrapperWithPreferredFilename中发现问题:进行检查以确保存在预期的文件包装器。通常情况下,如果文件已损坏,或者应用程序的版本2使用不同的文件格式。但是,优雅地处理这些情况属于“偏执编程期望那种事情”的标题,而不是“只需等待一秒钟,所有数据都可供您使用。”

0 个答案:

没有答案