我正在尝试从S3存储桶并行下载几个图像,我想知道它们全部完成之后。我可以使用使用以下签名编写的函数来执行对象的下载:
func downloadImage(key: String) -> AWSTask
返回的AWSTask是来自AWSS3TransferUtility实例的一个:
downloadDataFromBucket:key:expression:completionHander:
当所有下载完成后,我想运行一些代码,所以我尝试了以下代码:
for image in imageList {
downloadTaskList.append(downloadImage(image))
}
AWSTask(forCompletionOfAllTasks:downloadTaskList).continueWithBlock {
(task: AWSTask!) -> AnyObject! in
print("All images downloaded")
return nil
}
在此代码中,imageList是字符串列表,而downloadTaskList是所有AWSTasks附加到的列表。
问题是在下载图像之前,它会立即打印“所有图像已下载”。我认为这是因为从downloadDataFromBucket返回的AWSTask在下载开始时而不是在下载完成时被视为完成。我可以将哪些AWSTask添加到列表中以使其工作?我尝试添加downloadDataFromBucket的完成处理程序,但它不是AWSTask。
最佳答案
我设法使用AWSTaskCompletionSource来完成自己的任务。我只需在函数顶部创建一个新的任务完成源:
let taskCompletionSource = AWSTaskCompletionSource()
我在函数末尾返回了相应的任务:
return taskCompletionSource.task
最后,我在完成处理程序中将任务设置为完成:
taskCompletionSource.setResult("Download Completed")
发生错误时,完成处理程序还会在taskCompletionSource上调用setError。