后台队列进程最小化时终止应用程序
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 的更多信息,请参阅这篇文章。
需要注意的一件事(引用 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.
我有 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 的更多信息,请参阅这篇文章。
需要注意的一件事(引用 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.