我正在尝试在我的应用中实现后台提取。
考虑这个功能:
func fetchAll(completion: @escaping (UIBackgroundFetchResult) -> Void){
DispatchQueue.global(qos: .background).async {
let dGroup = DispatchGroup()
dGroup.enter()
self.asyncFunc1 { _ in
dGroup.leave()
}
dGroup.enter()
self.asyncFunc2 { _ in
dGroup.leave()
}
...
dGroup.notify(queue: DispatchQueue.global(qos: .background)) {
print("All network requests completed")
completion(.newData)
}
}
}
此功能由
调用func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
let fetchcontroller = apiHandler()
fetchcontroller.fetchAll { (result) in
completionHandler(result)
}
completionHandler(.noData)
}
在我的AppDelegate中。
在模拟器中测试时,我发现以下情况:
当我的应用程序位于前台时,fetchAll会成功执行。但是,当我将我的应用程序发送到后台时,执行将暂停,直到应用程序返回到前台。
我想这与我对调度队列的不稳定知识有关。
你们任何人可以帮助我吗
答案 0 :(得分:1)
所以,我做了什么让这项工作,我有点困惑为什么它的工作原理:
我刚刚移动了
中的方法performFetchWithCompletionHandler
因此:
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
let fetchcontroller = apiHandler()
let dGroup = DispatchGroup()
dGroup.enter()
fetchcontroller.asyncFunc1 { _ in
dGroup.leave()
}
dGroup.enter()
fetchcontroller.asyncFunc2 { _ in
dGroup.leave()
}
...
dGroup.notify(queue: DispatchQueue.global(qos: .background)) {
print("All 3 network requests completed")
completionHandler(.newData)
}
}
希望这有助于某人