내 앱을 계속 진행할 수 없어서 종료해야하는 상황이 너무 심하게 잘못되면 사용자에게 경고 상자를 표시 한 다음 확인 버튼을 탭하면 앱을 종료하고 싶습니다. . 충분히 간단하게 들리는가?iOS 앱의 치명적인 오류 처리기
하지만 여기에 문제가 있습니다. 제 치명적인 오류 처리기가 제 3 자 라이브러리 (해당 소스 코드가 없음)에 의해 호출됩니다. 초기화시 치명적인 오류 처리기에 대한 포인터를 제공하고 치명적인 오류가 발생하면 단순히 루틴을 호출하여 절대로 반환하지 않을 것으로 기대합니다. 반환하면 제 3 자 라이브러리에서 오류를 처리 한 것으로 가정하고 계속 진행할 것입니다 (데이터가 일관성없는 상태에 있기 때문에 데이터가 손상 될 수 있음). 오류 처리기 끝에있는 응용 프로그램을 종료 할 수는 있지만 (사용자가 예상 한대로) 문제가 무엇인지 알려주는 메시지를 사용자에게 표시 할 수 있기를 원합니다.
불행하게도, 난 그냥 할 경우 :
-(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에서 돌아 오지 않아야합니다. 이제까지. 그러나 주 스레드에 있기 때문에 fatalErrorHandler가 반환 될 때까지 UIAlertView가 표시되지 않습니다. 캐치 22.
치명적인 오류 처리기에서 돌아 오지 않고 사용자에게 경고를 표시하는 방법에 대한 아이디어가 있습니까?
문제는 내가 주 스레드에 있는데, 잠시 동안 실행 루프가 실행되지 않게됩니다. –
타사 라이브러리는 다른 스레드에서 fatalErrorHandler를 호출 할만큼 똑똑해야합니다. 그건 애도 야. – Vik
또한 애플의이 코드는 흥미로울 수있다. 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 (source); } }' – Vik