如果你有
var networkQueue = [NetworkRequest]()
var networkQueueActive = false
那么,你的
networkRetrieveFromQueue
应:
-
检查队列是否为空;
-
如果没有,抓取队列中的第一个项目;
-
发起异步请求;和
-
在该异步请求的完成处理程序中,调用
networkRetrieveFromQueue
2秒后再次
因此
func startQueue() {
if networkQueueActive { return }
networkQueueActive = true
processNext()
}
// if queue not empty, grab first item, perform request, and call itself
// 2 seconds after prior one finishes
func processNext() {
if networkQueue.isEmpty {
networkQueueActive = false
return
}
let request = networkQueue.removeFirst()
get(request: request) {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.processNext()
}
}
}
您的“流程请求”可能如下所示:
// perform asynchronous network request, with completion handler that is
// called when its done
func get(request: NetworkRequest, completionHandler: @escaping () -> Void) {
let task = URLSession.shared.dataTask(with: request.request) { data, _, error in
guard let data = data, error == nil else {
print(error ?? "Unknown error")
completionHandler()
return
}
// process successful response here
// when done, call completion handler
completionHandler()
}
task.resume()
}
现在,我不知道你的
NetworkRequest
看起来像,但这说明了如何在某个异步方法的完成处理程序中递归调用函数的基本思想。