UIDocument openWithCompletionHandler: сбой

Я использую 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)

Может ли кто-нибудь помочь мне решить эту проблему? Бывает очень редко, но все равно очень неприятно


person NikGreen    schedule 13.08.2012    source источник
comment
Какое исключение выбрасывается? Либо перехватите и зарегистрируйте исключение, либо установите точку останова для источника исключения (нажмите + в нижней части панели исключений и добавьте точку для источника исключения). Это даст вам понять, почему возникает исключение.   -  person Jody Hagins    schedule 13.08.2012
comment
Я использую точки останова исключений. Чтобы было понятнее, я никогда не ловил это исключение самостоятельно, но некоторые пользователи предоставили мне журналы сбоев. Можно ли регистрировать исключения на устройстве другого пользователя?   -  person NikGreen    schedule 13.08.2012


Ответы (2)


Ошибка возникает, если ваше приложение пытается дважды подряд вызвать метод 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:
person RobW    schedule 07.09.2012
comment
Как решить этот сбой? У меня тоже такая же проблема. - person Shyam; 26.02.2019

Что ж, утверждение в коде UIDocument не выполняется. Вероятно, вам следует предоставить больше кода, потому что вы явно что-то настраиваете неправильно.

Затем утверждение генерирует исключение. Если вы @catch исключения в этом методе, вы можете зарегистрировать исключение.

Или вы можете назначить потоку свой собственный NSAssertionHandler и напрямую просмотреть утверждение.

person Jody Hagins    schedule 14.08.2012