我在我的项目中使用Core Data,并在以下代码部分中获得罕见的崩溃
-(void) useDocument{
AFFormsCoreDataEngine* engine = [AFFormsCoreDataEngine sharedInstance];
if (![[NSFileManager defaultManager] fileExistsAtPath: [engine.formsDatabase.fileURL path]])
{
[engine.formsDatabase saveToURL: engine.formsDatabase.fileURL forSaveOperation: UIDocumentSaveForCreating completionHandler: ^(BOOL success){
// setup
}];
}
else if (engine.formsDatabase.documentState == UIDocumentStateClosed)
{
[engine.formsDatabase openWithCompletionHandler: ^(BOOL success){
// setup
}];
}
else if (engine.formsDatabase.documentState == UIDocumentStateNormal)
{
// setup
}
}
这就是崩溃日志所说的:
Last Exception Backtrace:
0 CoreFoundation 0x371fd88f __exceptionPreprocess + 163
1 libobjc.A.dylib 0x31272259 objc_exception_throw + 33
2 CoreFoundation 0x371fd789 +[NSException raise:format:] + 1
3 Foundation 0x32ce83a3 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 91
4 UIKit 0x306b3149 -[UIDocument openWithCompletionHandler:] + 173
5 EETECH 0x00014d23 -[AFFormListViewController useDocument] (AFFormListViewController.m:150)
有人可以帮我解决这个问题吗?它很少发生,但仍然非常不愉快
答案 0 :(得分:13)
如果您的应用尝试紧密连续两次调用useDocument方法,则会出现错误。
因为openWithCompletionHandler:异步打开文档,所以当再次调用该方法时,文档可能仍在打开。
如果发生这种情况,您的应用程序最终会尝试打开文档两次(因为文档状态将保持UIDocumentStateClosed直到完成),这会导致抛出异常。
如果你有一个异常断点,你可能会在控制台中看到类似的东西:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to open or a revert document that already has an open or revert operation in flight:
答案 1 :(得分:2)
好吧,断言在UIDocument代码中失败了。你可能应该提供更多的代码,因为你显然是在设置不正确的东西。
断言然后抛出异常。如果您在此方法中使用@catch异常,则可以记录异常。
或者,您可以将自己的NSAssertionHandler分配给线程,并直接查看断言。