好吧,我發現這需要一定的時間,當應用前景留下不應中斷任務的解決方案。 所以我們需要beginBackgroundTask
和endBackgroundTask
小管家,你可以用它來執行代碼,即使應用程序是不是在前臺
class BackgroundTaskManager {
let backgroundDQ = DispatchQueue.global(qos: .background)
var backgroundUpdateTask: UIBackgroundTaskIdentifier!
init(withName: String) {
self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(withName: withName) {}
}
/* Using completion handler to know when code is done*/
func runBackgroundTask(withCode: @escaping (_ cH: @escaping() -> Void) -> Void)
{
backgroundDQ.async {
withCode() {
self.endBackgroungTask()
}
}
}
func endBackgroungTask() {
if backgroundUpdateTask != nil && backgroundUpdateTask != UIBackgroundTaskInvalid {
UIApplication.shared.endBackgroundTask(backgroundUpdateTask)
backgroundUpdateTask = UIBackgroundTaskInvalid
}
}
}
而且你可以使用它像
let taskManager = BackgroundTaskManager(withName: "LocalNotifications")
taskManager.doBackgroundTask() { (cH) in
//Your code goes here
//Send back completion handler so system knows when to finish background task
cH()
}
更多信息,您可以在上面找到Medium
首先謝謝你,會用'applicationWillTe rminate'。還有問題:f.e.我在保存一些表單並開始更新後開始更新通知,但隨後用戶終止了應用程序,並從「applicationWillTerminate」開始更新 - 第一次執行的情況如何?它會在'applicationWillTerminate'之前停止嗎? –
您應該測試一下,但我不確定在調用applicationWillTerminate之前系統是否關閉了您的進程,或者是否在applicationWillTerminate中執行代碼時繼續運行它們。但是您可以手動取消添加到DispatchQueue的工作項目,請參閱[this](https://stackoverflow.com/a/38372384/4667835)答案。 –