3

プロジェクトで 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)

誰でもこの問題を解決するのを手伝ってもらえますか? めったに起こりませんが、それでも非常に不快です

4

2 に答える 2

13

このエラーは、アプリがuseDocumentメソッドを2回続けて呼び出そうとすると発生します。

openWithCompletionHandler:はドキュメントを非同期で開くため、メソッドが再度呼び出されたときにドキュメントが開いたままになっている可能性があります。

これが発生した場合、アプリはドキュメントを2回開こうとします(ドキュメントの状態は完了するまで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:
于 2012-09-07T19:15:05.590 に答える
2

さて、UIDocument コードでアサーションが失敗しています。明らかに何かを不適切に設定しているため、おそらくより多くのコードを提供する必要があります。

その後、アサーションは例外をスローしています。このメソッドで例外を @catch すると、例外をログに記録できます。

または、独自の NSAssertionHandler をスレッドに割り当てて、アサーションを直接表示することもできます。

于 2012-08-14T00:11:18.250 に答える