2017-12-26 50 views
1

以下のコードを使用してダウンロードしようとしているAWSS3にアップロードされた画像があります。AWS S3、Swift 3から画像をダウンロードできません

コードはtransferManager.download(downloadRequest).continueWith(executor: AWSExecutor.default(), block: { (task: AWSTask<AnyObject>) -> Any? inまで実行されません。どうすればこの問題を解決できるか教えてください。ブロックは、ダウンロードが完了した後に呼び出されることになる完了ハンドラであることを(ポッドファイルから)使用

AWS SDKバージョン pod 'AWSCore', '~> 2.6.7' pod 'AWSS3', '~> 2.6.7'

static func testDownload(){ 

    let transferManager = AWSS3TransferManager.default() 

    let downloadingFileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("temp.jpg") 

    if let downloadRequest = AWSS3TransferManagerDownloadRequest(){ 

     downloadRequest.bucket = "bucket-name" 
     downloadRequest.key = "folderName/imageName.png" 
     downloadRequest.downloadingFileURL = downloadingFileURL 
     print("downloadRequest \(downloadRequest)") 
     transferManager.download(downloadRequest).continueWith(executor: AWSExecutor.default(), block: { (task: AWSTask<AnyObject>) -> Any? in 

      print("transferManager.download func called") 

      if(task.error != nil){ 
       print(task.error!.localizedDescription) 
       return nil 
      } 

      print(task.result!) 

      if let data = NSData(contentsOf: downloadingFileURL){ 

       DispatchQueue.main.async(execute: {() -> Void in 
        let image = UIImage(data: data as Data) 
        print("Downloaded Image: \(image)") 
       }) 
      } 
      return nil 
     }) 
    } 
} 

答えて

1

。それが起こるようにあなたは、ダウンロードの進行状況を追跡するには、次のコードを使用することができます。

downloadRequest.downloadProgress = {(bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) -> Void in 
    DispatchQueue.main.async(execute: {() -> Void in 
     //Update progress 
    }) 
} 

また、あなたはそれがあなたのバケット構成やInfo.plistの値と間違って何かかどうかを確認するために、テスト目的のためにメインスレッドを使用して試すことができますまたは何か他のもの...

transferManager.download(downloadRequest).continueWith(executor: AWSExecutor.mainThread(), block: { (task:AWSTask<AnyObject>) -> Any? in 

    if let error = task.error as? NSError { 
     if error.domain == AWSS3TransferManagerErrorDomain, let code = AWSS3TransferManagerErrorType(rawValue: error.code) { 
      switch code { 
      case .cancelled, .paused: 
       break 
      default: 
       print("Error downloading: \(downloadRequest.key) Error: \(error)") 
      } 
     } else { 
      print("Error downloading: \(downloadRequest.key) Error: \(error)") 
     } 
     return nil 
    } 
    print("Download complete for: \(downloadRequest.key)") 
    let downloadOutput = task.result 
    return nil 
}) 

出典:http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3transfermanager.html

+0

があまりにもこのコードを試してみましたが、それはまだ通過しない... – user44776

+0

あなたはコンソール出力を表示することができますか? – Anushk

+0

私は、WebサイトからMacに直接ダウンロードするのに比べて、S3からiOSシミュレータに10倍の時間を要することを認識しました。私はなぜS3がとても遅いのだろうかと思います。 – user44776

関連する問題