applicationWillTerminate и док, но хочет отменить это действие - PullRequest
1 голос
/ 28 декабря 2010

У меня есть несколько отдельных потоков, идущих в моем приложении, которые должны быть снесены правильно. Если пользователь выбирает пункт меню «Выход» в меню «Файл», я выдаю сообщение об ошибке ... пожалуйста, прекратите выполнение других действий перед выходом. Однако, если пользователь выходит из приложения из док-станции на компьютере Mac, приложение просто завершает работу и завершается сбоем, потому что другие потоки все еще пытаются сделать свое дело без срыва.

Я пытался -applicationShouldTerminate:, но он не срабатывает в случае с методом выхода из приложения ... если документ грязный. Если документ очищен или сохранен, то мое диалоговое окно отображается правильно.

ТАК Я полагаю, что реальный вопрос заключается в следующем: как остановить запрос «Вы хотите сохранить документ», прежде чем мы обнаружим, что документ все еще занят?

спасибо

Ответы [ 2 ]

8 голосов
/ 28 декабря 2010

Использование -applicationShouldTerminate: в вашем делегате NSApplication является правильным решением.

Однако для приложений, построенных на Mac OS X 10.6 и более поздних версиях, есть функция под названием Sudden Termination, с которой вы, вероятно, сталкиваетесь,Это довольно просто описано в Foundation Release Notes .

В результате ваши фоновые задачи должны предотвращать внезапное завершение:

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

    // real task work

    [processInfo enableSuddenTermination];
}

Таким образом, ваше приложение будетотправляется -terminate: соответствующим образом, когда вы просите его выйти, когда он занят, что, в свою очередь, вызывает -applicationShouldTerminate: вашего делегата NSApplication, что позволит вам корректно остановить ваши задачи или попросить пользователя отменить их.

Если вы выполняете свои долгосрочные задачи в NSOperation или его подклассе, было бы хорошо просто добавить эту поддержку в общем, а не добавлять ее ко всем вашим задачам по отдельности.(Не забудьте снова включить внезапное завершение независимо от того, как ваша задача останавливается, завершается ли она или отменяется.)

0 голосов
/ 28 декабря 2010

Эта предыдущая запись StackOverflow может помочь:

Событие выхода из приложения

Вы можете переопределить обработчик событий по умолчанию, когда выбран пункт меню Quit.

...