我有一个在DispatchQueue中运行的进程,该进程创建了一个临时文件。该文件在defer块中被删除,因此无论是否抛出错误还是我通常仅从process()
返回,都会进行清理。参见下面的代码
func process() throws {
let file = createTemporaryFile()
defer {
deleteTemporaryFile(file)
}
try callCodeThatMightThrowErrors()
}
dispatchQueue.async {
do {
try process()
} catch {
dealWithError()
}
}
现在一切正常,直到我退出我的应用程序。如果我当前在process()
函数的中间有一个DispatchQueue,则不会运行defer块,并且不会删除该文件,并且我会在系统中留下一个临时文件。有什么办法可以使这个延迟块被调用?我宁愿不必存储需要在应用程序出口处删除的临时文件的全局数组。
答案 0 :(得分:4)
您需要:
无论哪种方式,NSApplicationDelegate
都有一种方法(applicationShouldTerminate
)询问您是否可以终止。在进程运行时,您应该返回NSTerminateLater
,然后在进程完成后调用replyToApplicationShouldTerminate
。
您还应确保在进程运行时禁用突然终止,以便您实际获得终止协商。请参见ProcessInfo
disableSuddenTermination`
答案 1 :(得分:0)
您是否真的必须在应用退出时清理?如果您确定应用程序启动时不能存在临时文件,请在其中添加清除代码。这样,无论用户或操作系统如何终止应用程序,清理代码都将运行。当然,如果该过程没有终止,您可以在现在执行的位置清理临时文件。