2016-08-20 184 views
4

我爲我的應用使用了Firebase存儲。在我的應用中,用戶擁有個人資料,可以上傳個人資料照片,然後當他們將來點擊他們的個人資料時,它應該下載並顯示他們的個人資料照片。問題是,當我上傳和下載照片時,會出現明顯的延遲,並且代碼在應該執行時不運行。對於下載,我的電話號碼是ViewWillAppear(),但即使在屏幕載入後我仍然繼續運行,並且我點擊了其他內容。我如何加快速度?延遲不僅令人討厭,而且當我移動到另一個視圖或註銷並且ViewWillAppear()中的代碼仍在運行時,它會導致崩潰。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服務器(文件上傳到哪裏)的往返速度很慢。沒有辦法改變這一點。雖然我們也無法改變往返速度(或此事的帶寬),但我們正在研究如何針對這種情況進行優化。對於下載,您可以嘗試[從downloadURL下載](https://firebase.google.com/docs/storage/ios/download-files#generate_a_download_url)和下載庫(如SDWebImage),以查看是否可以解決問題。 –

回答

1

這是最有可能一個的組合)中的數據有多大你想下載的,B)什麼樣的網絡你在的,c)如果你的位置,和d)你對「慢」的定義是什麼。 :)

這就是說,「普通的iPhone照片」真的很嚇人' - 例如,iPhone 6s拍攝的照片是4032 x 3024.而我的猜測是你的imageView比整體小得多。因此,建議您根據您認爲最終需要的圖片大小將您的圖片上傳到Firebase存儲之前調整圖片之前的

我也同意弗蘭克是使用組合downloadURL與像SDWebImagePINRemoteImage,或AlamoFireImage庫可能是一個好主意。這些庫負責處理重要任務,如加載主線程,緩存,並且如果目標imageView突然消失,通常不會崩潰。

-1

將NSData轉換爲UIImage時,您應該使用後臺線程,或者您可以獲取圖像url並使用Kingfisher pod。我更喜歡第二種選擇。

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() 

    } 
})