从iOS(Swift)上的AWS S3存储桶中并行下载对象

时间:2016-06-27 14:50:53

标签: ios swift amazon-web-services amazon-s3

我正在尝试从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。

1 个答案:

答案 0 :(得分:1)

我设法使用AWSTaskCompletionSource创建自己的任务。我只是在我的函数顶部创建一个新的任务完成源:

let taskCompletionSource = AWSTaskCompletionSource()

我在函数末尾返回相应的任务:

return taskCompletionSource.task

最后,我在完成处理程序中将任务设置为已完成:

taskCompletionSource.setResult("Download Completed")

如果出现错误,完成处理程序还会在taskCompletionSource上调用setError。