2010-12-28 2 views
1

올바르게 분리해야하는 응용 프로그램에 별도의 스레드가 있습니다. 사용자가 파일 메뉴에서 종료 메뉴 항목을 선택하면 다음과 같은 오류가 발생합니다. 종료하기 전에 수행중인 다른 작업을 중지하십시오. 그러나 사용자가 맥에서 응용 프로그램 도크에서 응용 프로그램을 종료하면 응용 프로그램이 종료되고 다른 스레드가 여전히 올바르게 찢어지지 않고 자신의 일을하려고하기 때문에 충돌이 발생합니다.applicationWillTerminate 및 도크가 있지만이 작업을 취소하고 싶습니다.

나는 -applicationShouldTerminate:을 시도했지만, 응용 프로그램 도킹을 종료하는 경우에는 트리거하지 않습니다 ... 문서가 더러운 경우. 문서가 일명 저장된 경우 내 대화 상자가 올바르게 표시됩니다.

그렇다면 실제 질문은 문서를 계속 사용하기 전에 '문서를 저장 하시겠습니까?'라는 질문을 어떻게 중지합니까? 당신의 NSApplication 위임에 -applicationShouldTerminate:을 사용

감사

답변

7

는 옳은 일이다.

그러나 Mac OS X 10.6 이상을 기반으로하는 응용 프로그램의 경우 Sudden Termination이라는 기능이 있습니다. Foundation Release Notes에서 매우 간단하게 설명됩니다. 당신이 다시 당신의 NSApplication를 호출 할 것이다, 그것은 바쁜 동안 종료를 요청할 때

- (void)longRunningTask { 
    NSProcessInfo *processInfo = [NSProcessInfo processInfo]; 
    [processInfo disableSuddenTermination]; 

    // real task work 

    [processInfo enableSuddenTermination]; 
} 

이 방법은, 응용 프로그램이 적절하게 -terminate:를 전송됩니다 :

결말은 백그라운드 작업이 갑자기 종료를 방지해야한다는 것입니다 대리인의 -applicationShouldTerminate:을 사용하면 작업을 정상적으로 중지하거나 취소 할 수 있습니다.

NSOperation 또는 하위 클래스에서 장기 실행 작업을 수행하는 경우이 작업을 모든 작업에 개별적으로 추가하는 대신 포괄적으로 추가하는 것이 좋습니다. (이 완료 또는 취소 여부를, 당신의 작업을 중지하는 방법에 상관없이 갑자기 종료를 다시 활성화하지하는 것을 잊지 마십시오.)

0

이 이전 StackOverflow의 게시물이 도움이 될 수

Application exit event

당신은 무시할 수 Quit 메뉴 항목이 선택 될 때 기본 이벤트 핸들러.