好吧,我发现这需要一定的时间,当应用前景留下不应中断任务的解决方案。 所以我们需要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)答案。 –