Swift Alamofire 如何处理来自循环的所有请求
Posted
技术标签:
【中文标题】Swift Alamofire 如何处理来自循环的所有请求【英文标题】:Swift Alamofire how to handle all requests from loop 【发布时间】:2017-02-07 15:18:10 【问题描述】:我需要执行包含 10 个 Alamofire 请求的循环。当所有 10 个请求都完成时,如何处理?
【问题讨论】:
你的问题太模糊不清了。 【参考方案1】:创建一个包装类来发送网络请求。例如
class HttpRequest
static var requestCount:Int = 0
class func sendRequest(onCompletion:(Bool)->())
// Send alamofire request here
// below code is just a sample
Alamofire.request(...).validate().response(..completionHandler..)
// Check response & increment request count
requestCount += 1
if requestCount == 10
// calling completion handler here
onCompletion(true)
现在把它当作
HttpRequest.sendRequest(onCompletion:(isCompleted)
// Whatever you wanted to do after 10 request gets completed
)
PS:以上提供的代码只是一个原型。实际语法可能不同
【讨论】:
【参考方案2】:将请求包装在 Promise(第三方)或 Operations(第一方)中可以让您对请求和代码进行一些依赖管理,以便在它们全部完成后执行。
为了快速而肮脏的修复,您可以使用调度组。
let dispatchGroup = DispatchGroup()
var responses = [DataResponse<String>]()
dispatchGroup.enter()
Alamofire.request("https://www.google.com").responseString response in
DispatchQueue.main.async
responses.append(response)
dispatchGroup.leave()
dispatchGroup.enter()
Alamofire.request("https://www.yahoo.com").responseString response in
DispatchQueue.main.async
responses.append(response)
dispatchGroup.leave()
dispatchGroup.enter()
Alamofire.request("https://www.bing.com").responseString response in
DispatchQueue.main.async
responses.append(response)
dispatchGroup.leave()
dispatchGroup.notify(queue: DispatchQueue.main)
print("Got \(responses.count) responses")
【讨论】:
在事先不知道要发出的请求数的情况下如何实现。例如,在我的情况下,我需要一个接一个地从不同的 URL 下载一组图像。我该怎么做?【参考方案3】:使用 DispatchGroups 实现这一目标的最佳方式
var myGroup = DispatchGroup()
firstAlamofireRequest()
myGroup.enter()
SecondAlamofireRequest()
myGroup.enter()
onFirstAlmoFireResponse()
myGroup.leave()
onSecondAlmoFireResponse()
myGroup.leave()
以及当 groupDespatcher 全部完成时
这个方法会被调用
myGroup.notify(qos: DispatchQoS.background, flags: DispatchWorkItemFlags.assignCurrentContext, queue: DispatchQueue.main)
// what to do after all requests are done
【讨论】:
以上是关于Swift Alamofire 如何处理来自循环的所有请求的主要内容,如果未能解决你的问题,请参考以下文章