如何获取 DispatchQueue() 代码以在应用程序退出时进行清理
How can I get DispatchQueue() code to cleanup on application exit
我在创建临时文件的 DispatchQueue 中有一个进程 运行ning。该文件在延迟块中被删除,因此无论是否抛出错误或我只是 return 从 process()
通常进行清理都会发生。请参阅下面的代码
func process() throws {
let file = createTemporaryFile()
defer {
deleteTemporaryFile(file)
}
try callCodeThatMightThrowErrors()
}
dispatchQueue.async {
do {
try process()
} catch {
dealWithError()
}
}
现在一切正常,直到我退出我的应用程序。如果我在 process()
函数中间有一个 DispatchQueue,则延迟块不是 运行 并且文件不会被删除,我会在系统中留下一个临时文件。有什么办法可以调用这个延迟块吗?我宁愿不必存储需要在应用程序退出时删除的全局临时文件数组。
不过,您真的必须在应用退出时进行清理吗?如果您确定应用程序启动时不存在临时文件,请在此处添加清理代码。这样,无论用户或 OS 如何终止应用程序,您的清理代码都将 运行。当然,如果进程未终止,您可以在此处清理临时文件。
您需要:
- a) 防止您的应用程序在您的进程处于 运行 或
时终止
- b) 知道什么时候终止并取消你的进程
无论哪种方式,NSApplicationDelegate
都有一个方法 (applicationShouldTerminate
) 来询问您它是否可以终止。当你的过程是 运行 时,你应该 return NSTerminateLater
,然后当过程完成时,调用 replyToApplicationShouldTerminate
.
您还应该确保在您的进程 运行 时禁用突然终止,以便您真正获得终止委托。参见 ProcessInfo
disableSuddenTermination`
我在创建临时文件的 DispatchQueue 中有一个进程 运行ning。该文件在延迟块中被删除,因此无论是否抛出错误或我只是 return 从 process()
通常进行清理都会发生。请参阅下面的代码
func process() throws {
let file = createTemporaryFile()
defer {
deleteTemporaryFile(file)
}
try callCodeThatMightThrowErrors()
}
dispatchQueue.async {
do {
try process()
} catch {
dealWithError()
}
}
现在一切正常,直到我退出我的应用程序。如果我在 process()
函数中间有一个 DispatchQueue,则延迟块不是 运行 并且文件不会被删除,我会在系统中留下一个临时文件。有什么办法可以调用这个延迟块吗?我宁愿不必存储需要在应用程序退出时删除的全局临时文件数组。
不过,您真的必须在应用退出时进行清理吗?如果您确定应用程序启动时不存在临时文件,请在此处添加清理代码。这样,无论用户或 OS 如何终止应用程序,您的清理代码都将 运行。当然,如果进程未终止,您可以在此处清理临时文件。
您需要:
- a) 防止您的应用程序在您的进程处于 运行 或 时终止
- b) 知道什么时候终止并取消你的进程
无论哪种方式,NSApplicationDelegate
都有一个方法 (applicationShouldTerminate
) 来询问您它是否可以终止。当你的过程是 运行 时,你应该 return NSTerminateLater
,然后当过程完成时,调用 replyToApplicationShouldTerminate
.
您还应该确保在您的进程 运行 时禁用突然终止,以便您真正获得终止委托。参见 ProcessInfo
disableSuddenTermination`