我如何获取DispatchQueue()代码以在应用程序退出时进行清理

时间:2019-02-14 16:24:56

标签: swift macos cocoa grand-central-dispatch

我有一个在DispatchQueue中运行的进程,该进程创建了一个临时文件。该文件在defer块中被删除,因此无论是否抛出错误还是我通常仅从process()返回,都会进行清理。参见下面的代码

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

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

现在一切正常,直到我退出我的应用程序。如果我当前在process()函数的中间有一个DispatchQueue,则不会运行defer块,并且不会删除该文件,并且我会在系统中留下一个临时文件。有什么办法可以使这个延迟块被调用?我宁愿不必存储需要在应用程序出口处删除的临时文件的全局数组。

2 个答案:

答案 0 :(得分:4)

您需要:

  • a)阻止您的应用在进程运行时终止,或者
  • b)了解何时终止,并取消您的流程

无论哪种方式,NSApplicationDelegate都有一种方法(applicationShouldTerminate)询问您是否可以终止。在进程运行时,您应该返回NSTerminateLater,然后在进程完成后调用replyToApplicationShouldTerminate

您还应确保在进程运行时禁用突然终止,以便您实际获得终止协商。请参见ProcessInfo disableSuddenTermination`

答案 1 :(得分:0)

您是否真的必须在应用退出时清理?如果您确定应用程序启动时不能存在临时文件,请在其中添加清除代码。这样,无论用户或操作系统如何终止应用程序,清理代码都将运行。当然,如果该过程没有终止,您可以在现在执行的位置清理临时文件。