难以想象这个...
我想我需要2个线程,并且不确定如何实现它们。
完成后,每个网络检索请求之间至少要有2秒的延迟。
主线程:
按下UIButton->函数将网络检索请求添加到串行队列-> UILoop继续...
网络线程:
检查队列中的下一个请求->开始请求->完成请求->等待2秒->检查队列中的下一个请求->开始请求->完成请求->等待2秒->检查队列对于下一个请求->没有请求->检查队列是否有下一个请求...或Ends循环直到被调用。
var networkQueue = [NetworkRequest]()
var networkQueueActive = false
@IBAction func buttonPressed(_ sender: UIButton) {
networkQueue.append(NetworkRequest(UIButton))
if networkQueueActive == false {
networkRetrieveFromQueue() // need to asynchronously call this DON'T KNOW HOW TO DO THIS
}
}
func networkRetrieveFromQueue() {
networkQueueActive = true
while !networkQueue.isEmpty {
let request = networkQueue.remove(at: 0)
// synchronous network data retrieval on this thread KNOW HOW TO DO THIS
// do something with the data retrieved KNOW HOW TO DO THIS
// wait 2 seconds DON'T KNOW HOW TO DO THIS
}
networkQueueActive = false
}
如果你有
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
模样,但这说明了如何在某些异步方法的完成处理程序中递归调用函数的基本思想。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句