2016-08-20 21 views
4

私は自分のアプリにFirebase Storageを使用しています。私のアプリでは、ユーザーがプロフィールを持っていて、プロフィール写真をアップロードすることができます。その後、プロフィールをクリックすると、プロフィール写真がダウンロードされて表示されます。問題は、写真をアップロードしてダウンロードするとかなりの遅延があり、コードが実行されていないときにコードが実行されていないように見えることです。ダウンロードのために、私はViewWillAppear()に電話をしていますが、画面がロードされた後でも実行し続け、他のものをクリックしています。どうすればこれをスピードアップできますか?遅延が煩わしいだけでなく、別のビューまたはログアウトに移動してViewWillAppear()のコードがまだ実行されているときにクラッシュが発生します。それはほとんど可能性が高いa)はどのくらいのデータがダウンロードしようとしているであることは、あなたがにしているネットワークのb)にはどのような、あるC)あなたが配置している場合、およびd)の組み合わせだiOS - Firebaseストレージのダウンロードが遅い

override func viewWillAppear(bool: Bool) { 

    var retPic : UIImage 
    let storage = FIRStorage.storage() 

    let storageRef = storage.referenceForURL("gs://project-xxxxxxxxxxx.appspot.com") 

    let profPicRef = storageRef.child("images/" + (FIRAuth.auth()?.currentUser?.uid)! + ".jpg") 
    // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes) 

    profPicRef.dataWithMaxSize(1 * 4096 * 4096) { (data, error) -> Void in 
     if (error != nil) { 
      print(error) 
     } else { 
      // Data for "images/island.jpg" is returned 
      print("This is delayed") 
      self.retPic = UIImage(data: data!)! 
      self.imageView.image = self.retPic 
        print("still here") 
      self.imageView.reloadInputViews() 
     } 
    } 
} 
+0

ファイルがどのくらいありますか?どのタイプのネットワークをダウンロードしていますか?インターネット速度はおそらくあなたの最大の減速です。特に携帯端末では、これはかなり制限されています。 –

+0

ファイルはあまりにも大きくない、それは単なる通常のiphone写真です。少なくとも画面を切り替えるときにメソッドの実行を強制的に強制する方法はありますか?これをスピードアップするにはどうしたらいいですか? – Alex

+0

私はいくつかのエンジニアと確認しました。最善の策は、GCSサーバー(ファイルのアップロード先)へのラウンドトリップが遅いことです。それを変えるためにあなたができることは何もありません。往復速度(またはその帯域幅)も変更できませんが、このようなシナリオを最適化する方法を検討しています。ダウンロードの場合、ダウンロードライブラリ(SDWebImageなど)を使用して[downloadURLからダウンロードする](https://firebase.google.com/docs/storage/ios/download-files#generate_a_download_url)を試して、問題が削除されているかどうかを確認することができます。 –

答えて

1

あなたの「遅い」の定義は何ですか? :)

「普通のiPhoneの写真」は本当に大変です - 例えばiPhone 6sでは4032 x 3024の写真が撮られています。私の推測はあなたのimageViewはそれよりずっと小さい。したがって、の画像のサイズを変更することをお勧めします。は、最終的に必要と思われる画像サイズに基づいてFirebase Storageにアップロードします。

私はまたSDWebImagePINRemoteImage、またはAlamoFireImageのようなライブラリと組み合わせてdownloadURLを使用すると、おそらく良い考えであることをフランクに同意します。これらのライブラリは、メインスレッドの読み込み、キャッシングなどの重要なタスクを処理し、ターゲットimageViewが突然消えてしまうとクラッシュすることはありません。

-1

NSDataをUIImageに変換するときにバックグラウンドスレッドを使用するか、画像URLを取得してKingfisherポッドを使用する必要があります。私は第二の選択肢を好む。

Swift3バージョン:

import Kingfisher 

profPicRef.downloadURL(completion: { (url, error) in 

    if error != nil { 

     print(error) 
    } 
    else{ 

     let retPicUrl = (url?.absoluteString)! as String 

    self.imageView.kf.setImage(with: URL(string: retPicUrl)!) 
    self.imageView.reloadInputViews() 

    } 
}) 
関連する問題