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 无法再次关闭?的主要内容,如果未能解决你的问题,请参考以下文章
使用 setUbiquitous 为 UIDocument 文件关闭 iCloud 同步时出错(LibrarianErrorDomain 错误 2)