3 votes

UIDocument openWithCompletionHandler : crash

J'utilise Core Data dans mon projet et j'obtiens un rare crash dans la section de code suivante

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

Voici ce que dit le journal des collisions :

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)

Quelqu'un peut-il m'aider à résoudre ce problème ? Cela arrive très rarement, mais c'est tout de même très désagréable.

13voto

RobW Points 171

L'erreur se produit si votre application tente d'appeler la méthode useDocument deux fois de suite.

Étant donné que la méthode openWithCompletionHandler : ouvre le document de manière asynchrone, il se peut que le document soit encore ouvert lorsque la méthode est appelée à nouveau.

Dans ce cas, votre application tente d'ouvrir le document deux fois (car l'état du document reste UIDocumentStateClosed jusqu'à la fin), ce qui entraîne la levée de l'exception.

Si vous avez un point d'arrêt d'exception, vous pouvez voir quelque chose comme ceci dans la console :

 *** 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:

2voto

Jody Hagins Points 15644

Une assertion échoue dans le code de l'UIDocument. Vous devriez probablement fournir plus de code, car il est évident que vous avez mal configuré quelque chose.

L'assertion lance alors une exception. Si vous @catchez des exceptions dans cette méthode, vous pouvez enregistrer l'exception.

Vous pouvez également assigner votre propre NSAssertionHandler au thread et voir l'assertion directement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X