3

在下面的代码中,没有一个完成处理程序被执行。我能找到的一个解释是iPhone Simulator 5.1 with Xcode 4.5 using UIManagedDocument 中的这个 Bug。它说这可能是 iPhone 模拟器 5.1 中的一个错误。但是,我尝试过 iPhone 模拟器 6.0、6.1 和 7.0,但都没有工作。我会非常感谢你的帮助。

(顺便说一句,我在斯坦福 iOS 课程第 14 课中看到过这段代码)

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"DataDocument"];
UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url];

if(![[NSFileManager defaultManager] fileExistsAtPath:[url path]]){

        NSLog(@"This logs");

    [document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){

        NSLog(@"This never logs");

    }];

}else if(document.documentState == UIDocumentStateClosed){

        NSLog(@"This logs");
    [document openWithCompletionHandler:^(BOOL success){
        NSLog(@"This never logs");
    }];

}else{
    //I have a separate log for this, but it's never 'else'
}

编辑:我发现了一个似乎正在处理完全相同的问题的问题。我无法获得 nsmanageobjectcontext我只是将其固定到未执行的完成处理程序。

编辑:我发现了问题所在:因为 openWithCompletionHandler 异步执行,所以我的应用程序会在文档完成打开之前尝试使用它。使用运行循环解决了这个问题。下面的例子。

if(doc.documentState == UIDocumentStateClosed){

    NSLog(@"This logs");
    __block BOOL waitingOnCompletionHandler = YES;
    [doc openWithCompletionHandler:^(BOOL success){

        NSLog(@"This logs too!");

    }];

    while (waitingOnCompletionHandler) {
       NSDate *futureTime = [NSDate dateWithTimeIntervalSinceNow:0.1];
       [[NSRunLoop currentRunLoop] runUntilDate:futureTime];
    }

}
4

0 回答 0