我有一个异步功能,可以从最后一次调用中同步网络和数据库,然后返回结果。有几个来自不同线程的调用者调用此函数。
我不是在每次调用时执行和提供请求,而是希望在异步函数运行时排队任务,然后清空队列,以便下一组任务可以排队。
这是我到目前为止所得到的:
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)")
}
}
这种方法是否准确,或者是一种更优雅或更有效的方法来实现这种共享任务方法?