UIDocument 无法再次关闭?

Posted

技术标签:

【中文标题】UIDocument 无法再次关闭?【英文标题】:UIDocument couldn't close again? 【发布时间】: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 崩溃,例如在关闭时尝试恢复文档。同时打开文档,关闭文档完成处理程序永远不会在某个时候执行。如何解决这个问题?请帮忙。 【参考方案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】:

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

【讨论】:

以上是关于UIDocument 无法再次关闭?的主要内容,如果未能解决你的问题,请参考以下文章

尝试关闭 UIDocument 时防止崩溃

UIDocument 打开/关闭行为

使用 setUbiquitous 为 UIDocument 文件关闭 iCloud 同步时出错(LibrarianErrorDomain 错误 2)

文档关闭后调用的 Swift UIDocument 自动保存并且类不会取消初始化

在本地保存 UIDocument

在哪里存储 UIDocument 的预览?