后台Fetch不在后台执行

时间:2018-03-18 14:40:36

标签: grand-central-dispatch background-fetch

我正在尝试在我的应用中实现后台提取。

考虑这个功能:

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会成功执行。但是,当我将我的应用程序发送到后台时,执行将暂停,直到应用程序返回到前台。

我想这与我对调度队列的不稳定知识有关。

你们任何人可以帮助我吗

1 个答案:

答案 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)
        }

    }

希望这有助于某人