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

标签 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。

最佳答案

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

let taskCompletionSource = AWSTaskCompletionSource()

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

return taskCompletionSource.task

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

taskCompletionSource.setResult("Download Completed")

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

关于ios - 从 iOS (Swift) 上的 AWS S3 存储桶并行下载对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38057067/

相关文章:

swift - 如何使用由变量确定的按钮将 a 链接到第二个 View Controller ?

amazon-web-services - 为 S3 存储桶中的特定文件夹创建 CloudFormation 堆栈

iphone - 我是否通过在启动时获取一次对象并在我想保留数据时调用保存来正确使用核心数据?

ios - 在 Xamarin.Forms iOS 上设置 ScrollView 的 z-index

ios - 如何在 swift 3 ios 中使用 Model 类进行 REST API 调用

amazon-web-services - 是否可以使用 VPC 端点使用 AWS Athena?

amazon-web-services - 读取 CloudFormation 用户数据中的 AWS secret

ios - 在模型与 Controller 中使用 CoreLocation 的最佳实践

iphone - UITableView 删除行并显示 'no content' 行

objective-c - NSAlert 提示输入由以 root 身份运行的进程生成的文本