2012-08-13 96 views
3

我在我的项目中使用核心数据,并在下面的代码段UIDocument openWithCompletionHandler:崩溃

-(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

什么异常被抛出?捕获并记录异常,或为异常源设置断点(单击异常窗格底部的+,并添加异常源)。这将为您提供为什么抛出异常。 – 2012-08-13 12:42:33

+0

我使用异常断点。为了使事情更清楚,我从来没有发现过这种例外,但有些用户向我提供了崩溃日志。是否有可能在其他用户的设备上记录异常? – NikGreen 2012-08-13 15:47:14

回答

12

如果您的应用尝试连续两次调用您的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: 
2

嗯,在UIDocument代码中断言失败。你应该提供更多的代码,因为你很明显地设置了不正确的东西。

断言然后抛出异常。如果您在此方法中捕捉异常,则可以记录异常。或者,您可以将自己的NSAssertionHandler分配给该线程,并直接查看该断言。