如何使用操作查询发出多个 Alamofire 请求

Posted

技术标签:

【中文标题】如何使用操作查询发出多个 Alamofire 请求【英文标题】:How to make multiple Alamofire requests with operation query 【发布时间】:2019-04-16 13:46:35 【问题描述】:

我有一个使用 Alamofire 将多个图像上传到服务器的应用程序。每个图像在上传到服务器之前都需要一个上传令牌。因此,在 for 循环中,对于每个图像文件,

    我通过 Alamofire 发出获取请求以获取上传令牌

    获得令牌后,我通过 Alamofire 使用该令牌发出上传请求。

这是我的代码:

func uploadFile(image: imageToUpload, onCompletion: @escaping ((Bool) -> Void)) 

   ...//some code
       
   // Alamofire request to get an upload token
   getUploadToken()  uploadToken in 
     
   if uploadToken != nil 
       // Alamofire request to make the upload with uploadToken and image data
       makeUploadRequest(token: uploadToken, image: imageToUpload)  uploadResponse in 
              onCompletion(uploadResponse)
       
   

这是我的 for 循环遍历要上传的图像:

DispatchQueue.global(qos: .background).async 
    let group = DispatchGroup()
    for fileToUpload in filesToUpload 
        group.enter()
        FileOperations.shared.uploadFile(image: fileToUpload)  hasFinished in
            if hasFinished 
                group.leave()
            
        
        group.wait()
    

所以我需要使用队列来实现这一点。我的代码需要像这样工作:

    队列 1:图像 1 的 getUploadToken 请求。 队列 2:图像 1 的 makeUploadRequest。 队列 3:图像 2 的 getUploadToken 请求。 队列 4:图像 2 的 makeUploadRequest。

...等等。

所以只有在for循环中的image 1完成了它的整个过程之后,image 2才能开始它的进程。使用队列,即使应用程序是后台的,它也应该可以工作。

如何使用队列实现这种行为?

我可以使用DispatchGroup() 进行这项工作,但在应用程序后台运行时它不起作用。我研究并阅读了互联网上的所有内容,但似乎没有任何效果。所以我想用队列来完成这项工作。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

你是对的,你可以用 OperationQueue 来做到这一点,你需要做的只是子类 Operation 让它配置为执行你想要的操作并初始化一个 OperationQueue 并配置它运行一个后台线程,只允许一个并发任务。然后,按照您想要的顺序将操作添加到队列中,它们将开始执行。

【讨论】:

谢谢,我像你说的那样配置了一个 OperationQueue,但我无法将我的操作添加到这个队列中。可以举个例子吗? 你需要继承Operation的默认实现来创建你自己的异步操作。如何做到这一点在here 中进行了概述。按照这些说明创建子类后,实例化一个新子类并使用 .add() 函数将其添加到操作队列中。 我也不确定这是否有助于在您的应用程序被后台或终止时继续操作。你也应该看看Apple's documentation on background execution in ios【参考方案2】:

您能否将您的代码更改为以下代码并检查例如三张图片是否正确上传。

let group = DispatchGroup()
DispatchQueue.global(qos: .background).async 
    for fileToUpload in filesToUpload 
        group.enter()
        FileOperations.shared.uploadFile(image: fileToUpload)  hasFinished in
            if hasFinished 
                group.leave()
            
        
    


group.notify(queue: .main) 
    print("Finished all upload requests.")

【讨论】:

以上是关于如何使用操作查询发出多个 Alamofire 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何向 Alamofire 请求添加参数

alamofire 499 使用标头和参数发出获取请求时

带循环的 Alamofire 同步请求

在操场上使用 Alamofire 发出 http 请求的延迟

为啥即使我使用 Alamofire 发出请求,我的应用程序仍然冻结?

我如何使用 Alamofire 取消多个请求?