applicationWillTerminate и док, но хотите отменить это действие

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

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

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

Благодарность


person theprojectabot    schedule 28.12.2010    source источник


Ответы (2)


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

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

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

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

    // real task work

    [processInfo enableSuddenTermination];
}

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

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

person Chris Hanson    schedule 28.12.2010

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

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

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

person Evan Mulawski    schedule 28.12.2010