在GCD中的几个任务之间共享执行?

时间:2018-02-10 16:58:00

标签: swift multithreading concurrency grand-central-dispatch task-queue

我有一个异步功能,可以从最后一次调用中同步网络和数据库,然后返回结果。有几个来自不同线程的调用者调用此函数。

我不是在每次调用时执行和提供请求,而是希望在异步函数运行时排队任务,然后清空队列,以便下一组任务可以排队。

这是我到目前为止所得到的:

extension DataWorker {
    // Handle simultanuous pull requests in a queue
    private static let pullQueue = DispatchQueue(label: "DataWorker.remotePull")
    private static var pullTasks = [((SomeType) -> Void)]()
    private static var isPulling = false

    func remotePull(completion: ((SomeType) -> Void)?) {
        DataWorker.pullQueue.async {
            if let completion = completion {
                DataWorker.pullTasks.append(completion)
            }

            guard !DataWorker.isPulling else { return }
            DataWorker.isPulling = true

            self.store.remotePull { result in
                print("Remote pull executed")

                DataWorker.pullQueue.async {
                    let tasks = DataWorker.pullTasks
                    DataWorker.pullTasks.removeAll()
                    DataWorker.isPulling = false

                    DispatchQueue.main.async {
                        tasks.forEach { $0(result) }
                    }
                }
            }
        }
    }
}

以下是我测试它的方式,我预计只有100次迭代,但只有几次remotePull次执行:

DispatchQueue.concurrentPerform(iterations: 100) { iteration in
    self.dataWorker.remotePull { _ in
        print("Iteration: \(iteration)")
    }
}

这种方法是否准确,或者是一种更优雅或更有效的方法来实现这种共享任务方法?

0 个答案:

没有答案