我有一个应用程序,该应用程序使用 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循环中的映像1完成其整个过程之后,映像2才能开始其过程。有了队列,即使应用程序在后台运行,它也应该可以工作。
我如何通过队列来实现这种行为?
我可以通过DispatchGroup()
来实现这一目的。 ,但在应用程序后台运行时不起作用。我研究并阅读了互联网上的所有内容,但似乎无法正常工作。所以我想使它与队列一起工作。任何帮助将不胜感激。
答案 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.")
}