2017-12-29 38 views
0

これは基本的な質問ですが、これを動作させることはできません。私はAWS S3からイメージをダウンロードしています。ダウンロードの進行状況を確認でき、それに応じて進捗変数を更新することができます。しかし、私はこの変数に基づいてプログレスバーをアニメーション化する方法を見つけることができません。次のようにiOSの進行状況バーでAWS S3をダウンロード

(明らかに不格好)コードである:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    self.refresh() //re-gets user info. Having trouble with AWS randomly claiming I'm attempting to download using UnAuth even though I am logged in 
    tableView.deselectRow(at: indexPath, animated: true) 
    self.downloadProgressView.isHidden = false 
    self.proprietaryObject = proprietaryObjects[indexPath.row] 
    let expression = AWSS3TransferUtilityDownloadExpression() 
    expression.progressBlock = {(task, progress) in DispatchQueue.main.async(execute: { 
     self.progress = progress 
    }) 
    } 

    let transferUtility = AWSS3TransferUtility.default() 
    let resource = "\(self.proprietaryObject?.value1 ?? "NA")_\(self.proprietaryObject?.value2 ?? "NA")_\(self.proprietaryObject?.firstName ?? "NA")_\(self.proprietaryObject?.lastName ?? "NA")" 
    let type = "jpeg" 
    self.downloadingFileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(resource).\(type)") 
    transferUtility.download(to: self.downloadingFileURL!, bucket: AWSS3BucketName, key: "\(resource).\(type)", expression: expression, completionHandler: { (task, URL, Data, Error) in 
     if Error != nil { 
      print (Error!) 
     } 
     if let data = Data { 
      print("Data: \(data)") 
      let image = UIImage(data: data) 
      self.downloadedImage = image 
     } 
    }).continueWith(executor: AWSExecutor.default()) { (task) -> Any? in 
     if let error = task.error { 
      print("download error: \(error)") 
      self.refresh() 
     }else { 
      print("Download started") 
      print("User: \(self.user?.username ?? "NO USER")") 
      self.animatePath() 

     } 
     return nil 
    } 
} 
func animatePath() { 
    print("Animation Started") 
    if !(self.view.subviews.contains(downloadProgressView)) { 
     self.view.addSubview(downloadProgressView) 
     downloadProgressView.center = self.view.center 
     self.downloadProgressView.isHidden = false 
     self.downloadProgressView.layer.addSublayer(self.shapeLayer) 
    }else { 
     self.view.bringSubview(toFront: self.downloadProgressView) 
     self.downloadProgressView.isHidden = false 
     downloadProgressView.center = self.view.center 
     if !((downloadProgressView.layer.sublayers?.contains(self.shapeLayer))!) { 
      self.downloadProgressView.layer.addSublayer(self.shapeLayer) 
     } 

    } 
    func animate() { 
     if self.progress?.fractionCompleted == nil { 
      self.fraction = 0 
     }else { 
      self.fraction = 0 + (self.progress?.fractionCompleted)! 
     } 
     let animation = CABasicAnimation(keyPath: "strokeEnd") 
     animation.fromValue = CGFloat(self.shapeLayer.strokeEnd) 
     animation.toValue = CGFloat(self.fraction!) 
     animation.duration = 0.2 
     animation.fillMode = kCAFillModeForwards 
     self.shapeLayer.strokeEnd = CGFloat(self.fraction!) 
     self.shapeLayer.add(animation, forKey: "animation") 
    } 

    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1) , execute: { 
     //the one second delay gives self.progress.fractionCompleted time to be non-nil 
     repeat { 
      animate() 
      print("Completed: \((self.progress?.fractionCompleted)! * 100)%") 
     } while self.fraction! < 1 

     if self.fraction == 1 { 
      print("fraction achieved 100%. resetting to 0%") 
      self.fraction = 0 
      self.progress = nil 
      self.performSegue(withIdentifier: "proprietarySegue", sender: self) 
     } 
    }) 
} 

コンソールがインクリメントは%うまく「.fractionCompleted」と、それは100%に達したとき、それはセグエを実行し記録します。次のViewControllerのUIImageViewのイメージは、実際にダウンロードされたイメージです(表示されていないsegueの準備をオーバーライドします)。しかし、私はプログレスサークルの点滅だけを得ています。通常は、進捗状況が表示されず、segueを実行します。最初のsegueの直後、その後のダウンロードごとにdownloadProgressViewが表示されないか、または100%の完了が消えてから表示されます。

私は基本的に何かをやっている気がしていますか、それともスレッドと関係がありますか?

ご協力いただければ幸いです。

答えて

0

self.animatePath()が完了ブロックtransferUtilityで呼び出されました。そのため、アニメーションはダウンロードの最後に起こり、セグが実行されます。

試してみてください。

let expression = AWSS3TransferUtilityDownloadExpression() 
expression.progressBlock = {(task, progress) in 
    DispatchQueue.main.async(execute: { 
     self.progress = progress 
     self.animatePath() 
    }) 
} 
+0

これはそれでした。ありがとう、ヴィネッ! animatePath()呼び出しを進行ブロックに移動し、繰り返しアニメーションブロックを削除しました。また、それは技術的には不要だが、私は1秒遅れで去ってしまった。これは、このケースでは、それを持っていないよりもきれいに見えるからだ。また、 "self.shapeLayer.strokeEnd = 0"を "if self.fraction == 1"ブロックに追加する必要がありました。 – End3r117

関連する問題