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 如何处理来自循环的所有请求的主要内容,如果未能解决你的问题,请参考以下文章

如何处理来自 API 调用的 ios 数据

Alamofire:如何处理和分类错误?

如何处理 Alamofire 的异步特性 [重复]

如何处理网络中间请求的变化 - Alamofire

网速慢或服务器宕机时如何处理 Alamofire 请求?

如何处理Alamofire中的多部分/相关数据?