后台队列进程最小化时终止应用程序

Background Queue processes Terminates app when minimised

我有 3 个后台队列任务 运行正在启动应用程序。它们大约需要 25 秒才能完成。没有内存问题,任务本身也没有问题,任务只是为了 filtering/reading 数据目的 (SQLite) 通过数据库。

如果我在任务 运行ning 时最小化该应用程序,该应用程序将在 3 秒内终止,因为任何时候我在 3 秒后返回该应用程序时,该应用程序都会再次启动。最小化应用程序后,我立即收到“来自调试器的消息:由于信号 9 而终止”。我使用 Swift 和 iOS14,有没有办法在应用程序未从内存中释放的情况下完成 30 秒或更短的后台 SQLite DB 任务?或者只是 pause/kill 防止杀死应用程序的任务?

我 运行 我的任务使用 DispatchQueue Extension:

extension DispatchQueue {

static func background(delay: Double = 0.0, background: (()->Void)? = nil, completion: (() -> Void)? = nil) {
    DispatchQueue.global(qos: .background).async {
        background?()
        if let completion = completion {
            DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
                completion()
            })
        }
    }
}

static func backgroundFast(delay: Double = 0.0, background: (()->Void)? = nil, completion: (() -> Void)? = nil) {
    DispatchQueue.global(qos: .default).async {
        background?()
        if let completion = completion {
            DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
                completion()
            })
        }
    }
}

}

如果您只需要 25 秒来完成后台任务,您应该能够调用 beginBackgroundTask(withName:expirationHandler:) 方法来响应您的应用委托的 applicationDidEnterBackground(_:) 方法被调用。

这将为您提供最多 3 分钟的背景时间。

有关 Apple 的更多信息,请参阅这篇文章。

https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background/extending_your_app_s_background_execution_time

需要注意的一件事(引用 Apple 的文档)

Warning

If you are using scenes (see Scenes), UIKit will not call this method. Use sceneDidEnterBackground(_:) instead to perform any final tasks. UIKit posts a didEnterBackgroundNotification regardless of whether your app uses scenes.