Как получить код DispatchQueue () для очистки при выходе из приложения - PullRequest
0 голосов
/ 14 февраля 2019

У меня запущен процесс в DispatchQueue, который создает временный файл.Файл удаляется в блоке отсрочки, поэтому очистка происходит независимо от того, выдана ли ошибка или я просто возвращаюсь из process() в обычном режиме.См. Код ниже

func process() throws {
    let file = createTemporaryFile()
    defer {
        deleteTemporaryFile(file)
    }
    try callCodeThatMightThrowErrors()
} 

dispatchQueue.async {
    do {
        try process()
    } catch {
        dealWithError()
    }
}

Теперь все это работает нормально, пока я не выйду из приложения.Если у меня есть DispatchQueue в настоящее время в середине функции process(), блок отсрочки не запускается, и файл не удаляется, и я оставляю временный файл в системе.Есть ли какой-нибудь способ, которым я могу получить этот блок отложенного вызова?Я бы предпочел не хранить глобальный массив временных файлов, которые необходимо удалить при выходе из приложения.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Вам необходимо:

  • a) запретить завершение работы приложения во время работы вашего процесса, ИЛИ
  • b) узнать, когда происходит прерывание, и отменить процесс

В любом случае, NSApplicationDelegate имеет метод (applicationShouldTerminate), чтобы спросить вас, может ли он завершиться.Пока ваш процесс запущен, вы должны вернуть NSTerminateLater, а затем, когда процесс завершится, позвонить replyToApplicationShouldTerminate.

. Вы также должны убедиться, что внезапное завершение отключено во время работы вашего процесса, чтобы вы моглина самом деле получить прекращение Delgation.См. ProcessInfo disableSuddenTermination`

0 голосов
/ 14 февраля 2019

Вы действительно должны очистить при выходе из приложения, хотя?Если вы уверены, что при запуске приложения не может быть временного файла, добавьте туда свой код очистки.Таким образом, независимо от того, как пользователь или ОС закрыли приложение, ваш код очистки будет работать.Конечно, если процесс не завершен, вы можете очистить временные файлы там, где вы это делаете сейчас.

...