UIDocument openWithCompletionHandler 在iOS设备上无法完成。

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。
5个回答

8

我在使用iCloud共享数据的应用程序中遇到了同样的问题。我意识到,如果一个挂起的应用程序保持文档打开状态,openWithCompletionHandler:将只等待而不调用完成处理程序。如果您的情况是如此,请确保在您的应用程序进入后台时关闭该文档。


如果我忘记在完成处理程序中释放自定义的UIDocument类实例,我也会遇到基本相同的行为。它会保持打开状态,并且第二次尝试调用openWithCompletionHandler时会挂起。 - vargonian
@vargonian 那听起来很有道理... 但这个问题在处理内存的 ARC(自动引用计数)中也会出现。 - Sam Spencer

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

1
我清除了这个应用程序,重新启动了所有东西,现在好像运行得更好了。这比这个答案需要更多的工作,但已经足够接近了。仍然不确定是什么原因导致的。 - Justin Paulson
1
重新启动设备可以解决错误问题,这种现象有点神奇。 - Anton

2

在调用之前,请尝试检查ManagedDocument是否为nil-这是我能想到的block没有执行的唯一原因。


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

可能是因为我没有得到success的值为false。实际上,我根本没有得到任何返回值。 - Justin Paulson

0
对我来说,这是因为我在后台线程上调用了openWithCompletionHandler:。将其改为从主线程调用可以解决挂起问题。
dispatch_async(dispatch_get_main_queue(), ^{
    ...
    [document openWithCompletionHandler:^(BOOL success) {
        ...
    }];
});        

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接