Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何让DispatchQueue()代码在应用程序退出时进行清理_Swift_Macos_Cocoa_Grand Central Dispatch - Fatal编程技术网

Swift 如何让DispatchQueue()代码在应用程序退出时进行清理

Swift 如何让DispatchQueue()代码在应用程序退出时进行清理,swift,macos,cocoa,grand-central-dispatch,Swift,Macos,Cocoa,Grand Central Dispatch,我在DispatchQueue中运行了一个进程,该进程创建了一个临时文件。文件在延迟块中被删除,因此无论是抛出错误还是我只是正常从进程返回,都会进行清理。请参阅下面的代码 func process() throws { let file = createTemporaryFile() defer { deleteTemporaryFile(file) } try callCodeThatMightThrowErrors() } dispatch

我在DispatchQueue中运行了一个进程,该进程创建了一个临时文件。文件在延迟块中被删除,因此无论是抛出错误还是我只是正常从进程返回,都会进行清理。请参阅下面的代码

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

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

现在一切正常,直到我退出我的应用程序。如果在进程函数中间有一个Debug队列,则延迟块不运行,文件不被删除,我在系统中留下一个临时文件。有什么办法可以调用这个延迟块吗?我宁愿不必存储需要在应用程序退出时删除的临时文件的全局数组。

但你真的需要在应用程序退出时清理吗?如果您确定app start上不存在任何临时文件,请在其中添加清理代码。这样,无论用户或操作系统如何终止应用程序,您的清理代码都会运行。当然,如果进程没有终止,您可以从现在开始清理临时文件。

您需要:

阻止应用程序在进程运行时终止,或 b知道何时终止并取消您的流程 无论哪种方式,NSApplicationLegate都有一个方法ApplicationsShouldTerminate来询问您是否可以终止。进程运行时,应返回NSTerminateLater,然后在进程完成时调用replyToApplicationShouldTerminate


您还应该确保在进程运行时禁用突然终止,以便实际获得终止延迟。请参阅ProcessInfo DisableSuddenternation`

是的,我的意思是错误。编辑问题以表明这一点。可能引发错误的函数调用代码可能会持续相当长的一段时间。因此,在这种情况下,执行有限长度任务将不起作用。不过,了解这一点很有用。虽然我已经看到这是针对iOS而不是macOS的。在写了这个问题后,我已经考虑了很多,我不得不重新思考我应该如何处理退出时仍在运行的进程,并意识到我需要以尽可能整洁的方式终止这些进程。所以这个问题已经不再有效了。我不得不重新思考如何处理退出时仍在运行的进程。你的回答涵盖了我的出发点。