Когда что-то так ужасно ошибочно, что мое приложение не может продолжить и ему нужно выйти, я хочу открыть окно предупреждения пользователю, а затем закрыть приложение, когда они нажмут кнопку OK , Звучит достаточно просто, не так ли?Неустранимая обработчик ошибок в приложении iOS
Но вот в чем проблема: мой фатальный обработчик ошибок вызывается сторонней библиотекой (у меня нет исходного кода). Я даю им указатель на мой фатальный обработчик ошибок при инициализации, и когда они сталкиваются с фатальной ошибкой, они просто называют эту процедуру и ожидают, что она никогда не вернется. Если он вернется, сторонняя библиотека предположит, что я обработал ошибку, и она будет продолжаться на своем пути (возможно, искажая данные, потому что вещи сейчас находятся в противоречивом состоянии). Я мог бы просто выйти из приложения в конце моего обработчика ошибок (это то, что они ожидают), но я хочу сначала показать сообщение пользователю, чтобы сообщить им, в чем проблема.
К сожалению, если я просто делаю:
-(void)fatalErrorHandler:(NSString *)msg
{
// Log the error and shut down all the things that need
// to be shut down before we exit
// ...
// Show an alert to the user to tell them what went wrong
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:msg delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil];
[alert show];
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
exit(-1);
}
fatalErrorHandler возвращается сразу после [оповещений шоу], который говорит 3-й библиотеке партии, которые я обработал ошибку, и он будет продолжать, как будто ничего не произошло , Это нехорошо.
Мне не нужно возвращаться из fatalErrorHandler. Когда-либо. Но поскольку я нахожусь в основном потоке, UIAlertView не появится, пока fatalErrorHandler не вернется. Уловка-22.
Любые идеи о том, как я могу показать предупреждение пользователю, не возвращаясь из моего фатального обработчика ошибок?
Проблема в том, что я нахожусь в основном потоке, и while будет поддерживать выполнение цикла выполнения. –
Сторонняя библиотека должна быть достаточно умна, чтобы вызвать ваш fatalErrorHandler в другом потоке. Жаль – Vik
Также этот код от Apple может быть интересным 'void InstallSignalHandler() { // Удостоверьтесь, что сигнал не прерывает приложение. сигнал (SIGHUP, SIG_IGN); dispatch_queue_t queue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t source = dispatch_source_create (DISPATCH_SOURCE_TYPE_SIGNAL, SIGHUP, 0, queue); if (source) { dispatch_source_set_event_handler (источник,^{ MyProcessSIGHUP(); }); // Начать обработку сигналов dispatch_resume (источник); } } ' – Vik