UIDocument closeWithCompletionHandler:立即完成

时间:2013-07-18 17:50:44

标签: ios objective-c ios6 uidocument

closeWithCompletionHandler"的文档说:“保存操作结束后,执行completionHandler中的代码。”但是,在我的应用程序中这段代码:

NSLog(@"closeWithCompletionHandler");
[self.document closeWithCompletionHandler:^(BOOL success) {
    if (success) {
        NSLog(@"completionHandler");
...

立即执行(在iOS6.1上):

2013-07-18 19:43:12.673 FooBar[819:907] closeWithCompletionHandler
2013-07-18 19:43:12.675 FooBar[819:907] completionHandler <-- look here
2013-07-18 19:43:16.234 FooBar[819:907] encoded

即使实际向文件写入数据需要几秒钟(我知道通过跟踪contentsForType:error:)。

contentsForType:error:实现如下:

- (id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError
{
    NSMutableDictionary* wrappers = [NSMutableDictionary dictionary];
    [self encodeObject:self.data toWrappers:wrappers preferredFilename:kDocumentDataPath];
    NSFileWrapper* fileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:wrappers];

    NSLog("encoded");

    return fileWrapper;
}

请注意在completionHandler执行后很长时间编码完成:

2013-07-18 19:43:12.675 FooBar[819:907] completionHandler
2013-07-18 19:43:16.234 FooBar[819:907] encoded <-- look here

为什么会这样?在继续操作之前,我应该如何确保将数据写入文件?

1 个答案:

答案 0 :(得分:1)

我相信你想要寻找成功的价值,所以你的代码可能看起来像这样

“在继续操作之前,我应该如何确保将数据写入文件?”

completionHandler: 具有在保存并关闭操作之后执行的代码的块结束。该块不返回任何值,并具有一个参数: 成功 如果任何保存操作成功则为,否则为NO。

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIDocument_Class/UIDocument/UIDocument.html#//apple_ref/occ/instm/UIDocument/closeWithCompletionHandler

答案:

NSLog(@"closeWithCompletionHandler");
[self.document closeWithCompletionHandler:^(BOOL success) {
     if(success){   
         NSLog(@"completionHandler");
     }

“为什么会这样?”

有很多原因,一个可能是因为写入失败而且它正在回滚,另一个原因可能是iOS的额外操作系统开销。最后可能是你只是读错了时间长度。