【问题标题】:UIDocument couldn't close again?UIDocument 无法再次关闭?
【发布时间】:2012-03-05 09:00:56
【问题描述】:

当一个 UIDocument 关闭时,它可以再次关闭吗?即使重新打开后它的documentState是UIDocumentStateNormal?

请帮助我。非常感谢!

[document openWithCompletionHandler:^(BOOL success) {
    if (success) {

        [document closeWithCompletionHandler:^(BOOL success) {
            if (success) {

                [document openWithCompletionHandler:^(BOOL success) {
                    if (success) {

                        NSLog(@"%d", document.documentState);

                        //Exception
                        [document closeWithCompletionHandler:^(BOOL success) {
                            if (success) {
                            } 
                        }];
                    } 
                }];
            } 
        }];
    } 
}];

在“异常”标记处调用closeWithCompletionHandler时,抛出异常:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'closeWithCompletionHandler called while document is already closing'

【问题讨论】:

  • 我也面临同样的问题,虽然我使用了不同的 UiDocument 对象,但打开或关闭的重叠导致随机 NSInternalInconsistencyException 崩溃,例如在关闭时尝试恢复文档。同时打开文档,关闭文档完成处理程序永远不会在某个时候执行。如何解决这个问题?请帮忙。

标签: objective-c ios nsexception uidocument


【解决方案1】:

似乎每次实例化只能关闭一次 UIManagedDocument。

我遇到了这个问题,我没有重新打开同一个文档,而是创建了一个具有相同数据的新文档(使用自定义 initWith... 方法)。

然后您可以“重新关闭”文档的新实例。

请记住,文档的新实例将具有新的托管对象上下文,因此您可能不应该尝试使用原始文档中的托管对象。如果需要,在新实例中重新获取它们。

【讨论】:

  • 这是真的,但似乎已在 iOS 6 中修复。危险,请在 iOS 5 设备上测试您的应用程序,否则您将不会发现此问题!
【解决方案2】:

我有同样的问题,删除第二次关闭为我解决了这个问题。我发现只要我使用单独的 UIManagedDocument 实例进行第二次打开/关闭,我就不会收到此错误。

另外,我发现我在之前的代码中没有得到一致的错误。

【讨论】:

    【解决方案3】:

    请注意,当您调用第二个方法时,您仍在第一个 closeWithCompletionHandler 方法中。通过阅读似乎是原因的异常。

    【讨论】:

    • 但我认为“CompletionHandler”是指方法完成时的回调,不是吗?事实上,这段代码是我的情况的一个简化示例。
    • 当我在 documentState 为 UIDocumentStateNormal 的其他地方调用第二个 closeWithCompletionHandler 方法时,仍然存在相同的异常。
    • 你是对的,但例外的是它似乎没有处于就绪状态。尝试在 NSInvocation 中包装对 openWithCompletionHandler 的第二次调用,并在调用方法上执行 performSelector:AfterDelay:。
    • [文档 performSelector:@selector(closeWithCompletionHandler:) withObject:nil afterDelay:5.0f];
    • 我发现了问题。文档保存到的路径不是应用程序的“文档”目录。我将文档路径设置为“库/应用程序支持/文档​​”,就像 Apple Numbers 所做的那样。这可能会导致一些权限问题。非常感谢您!
    【解决方案4】:

    打开和关闭文档是一个异步活动(意味着它在后台的另一个线程上执行)。通过如此接近彼此的打开和关闭,您正在超越另一个过程。在执行下一步(打开或关闭)之前确保其他线程已完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 2011-06-07
      • 2016-02-16
      • 2016-07-19
      • 2020-02-07
      相关资源
      最近更新 更多