2016-06-27 24 views
1

S3バケットから複数の画像を並列してダウンロードしようとしていますが、すべて完了したら知りたいと思っています。 AWSS3TransferUtilityのインスタンスからこの1 AWSTaskが返さiOS(Swift)のAWS S3バケットからオブジェクトをParallellでダウンロードする

func downloadImage(key: String) -> AWSTask 

されています:

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 
} 

は、文字列とdownloadTaskListのリストであるリストのWHEです:完全なダウンロードのすべてのように、私はこのコードを試してみましたが、時にいくつかのコードを実行しますすべてのAWSTaskが追加されます。

問題は、画像がダウンロードされる前に「ダウンロードされたすべての画像」が即座に印刷されることです。これは、downloadDataFromBucketから返されたAWSTaskが、ダウンロードが完了したときにダウンロードが開始されたときにcompletetとみなされるためです。この作業を行う代わりに、どのAWSTaskをリストに追加できますか?私はdownloadDataFromBucketの完了ハンドラを追加しようとしましたが、AWSTaskではありません。

答えて

1

AWSTaskCompletionSourceを使用して自分のタスクを管理しました。私は、関数の最後に対応するタスクを返す

let taskCompletionSource = AWSTaskCompletionSource() 

return taskCompletionSource.task 

に完了として最後に私は、タスクを設定し、私は単に私の関数の先頭に新しいタスク完了ソースを作成します補完ハンドラ:

taskCompletionSource.setResult("Download Completed") 

補完ハンドラは、エラーが発生した場合にもtaskCompletionSourceに対してsetErrorを呼び出します。

+0

これはAWSのデフォルトの実装ではないというのは本当にダムです。これについて私の頭を引っ張って時間を浪費しました。これは私の既存のコード構造を使った簡単な修正でした! –

関連する問題