UIDocument openWithCompletionHandler未在iOS设备上完成

时间:2012-04-12 15:20:34

标签: ios iphone cocoa-touch objective-c-blocks uimanageddocument

我正在尝试使用openWithCompletionHandler:

打开托管文档

我遇到的问题是它在模拟器上工作正常,但是当我在iPhone 4上测试它时,完成处理程序永远不会完成。代码如下所示:

[theManagedDocument openWithCompletionHandler:^(BOOL success){
    if(success) [self documentIsReady];
    if(!success) NSLog(@"Couldn't Open Document");
}];

这在模拟器上工作正常,我进入documentIsReady调用(如果错误则调用“无法打开文档”)。但是在iPhone 4上它永远不会运行CompletionHandler块。我已经在整个块中放置了断点(在两个if语句之前和之后)并且没有任何东西被调用。控制台上没有“无法打开文档”,没有调用documentIsReady

我还必须提一下,这似乎是我第一次在iPhone上运行该应用程序,它将正常工作。我也将其封装在带有fileExistsAtPath:调用的if语句中。它正好进入if语句并调用openWithCompletionHandler:,但是完成块永远不会被解雇

我使用的是iOS 5.1和Xcode 4.3.2。

5 个答案:

答案 0 :(得分:8)

我在使用iCloud共享数据的应用中遇到了同样的问题。我意识到openWithCompletionHandler:只是等待,如果文档被暂停的应用程序保持打开状态,则永远不会调用完成处理程序。如果是这种情况,您应该确保在应用程序转到后台时关闭文档。

答案 1 :(得分:7)

在我的情况下,关闭我的iPad并重新启动它“修复”了这个问题。祝你好运!

答案 2 :(得分:2)

在调用之前尝试检查ManagedDocument!= nil - 这是我能想到为什么不执行该块的唯一原因。

答案 3 :(得分:0)

success可能为假的另一个原因是您更改了模型(例如,将属性添加到实体),但未从模拟器/设备中删除应用程序以更新模型。

答案 4 :(得分:0)

对我来说,这是因为我在后台线程上调用openWithCompletionHandler:。将其更改为从主线程调用即可修复挂起

dispatch_async(dispatch_get_main_queue(), ^{
    ...
    [document openWithCompletionHandler:^(BOOL success) {
        ...
    }];
});