如何通过操作查询发出多个Alamofire请求

时间:2019-04-16 13:46:35

标签: ios swift alamofire nsoperationqueue

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

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

  2.   
  3. 获取令牌后,我通过Alamofire发出带有该令牌的上传请求。

  4.   

这是我的代码:

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:对图片1的getUploadToken请求。
  2.   
  3. 队列2:图像1的makeUploadRequest。
  4.   
  5. 队列3:对图片2的getUploadToken请求。
  6.   
  7. 队列4:图片2的makeUploadRequest。
  8.   
     

...等等。

因此,只有在for循环中的映像1完成其整个过程之后,映像2才能开始其过程。有了队列,即使应用程序在后台运行,它也应该可以工作。

我如何通过队列来实现这种行为?

我可以通过DispatchGroup()来实现这一目的。 ,但在应用程序后台运行时不起作用。我研究并阅读了互联网上的所有内容,但似乎无法正常工作。所以我想使它与队列一起工作。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您是对的,您可以使用OperationQueue来完成此操作,您只需要做Operation子类,即可将其配置为执行所需的操作并初始化OperationQueue并将其配置为在后台线程上运行,并且仅允许一个并发任务。然后,按所需顺序将操作添加到队列中,它们将开始执行。

答案 1 :(得分:0)

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

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.")
}