11

我正在尝试使用打开托管文档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。

4

5 回答 5

8

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

于 2012-05-25T21:42:15.480 回答
7

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

于 2012-04-24T21:37:05.127 回答
2

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

于 2012-04-16T12:38:44.493 回答
0

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

于 2013-02-25T16:17:13.147 回答
0

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

dispatch_async(dispatch_get_main_queue(), ^{
    ...
    [document openWithCompletionHandler:^(BOOL success) {
        ...
    }];
});        
于 2020-08-14T12:30:40.160 回答