2016-05-24 22 views
0

感謝Firebase的重大更新,我將我的應用的圖像託管從AWS切換到現在包含的Firebase中的GS存儲。 我已經導入了所有必需的豆莢,這個應用程序已經成功上傳圖像到指定的桶,但問題是當我想下載到存儲器中的圖像存儲,並且應用程序崩潰,調試我發現在我的FIRStorageReference中出現以下錯誤對象:「使用未聲明的類型」FirebaseStorage「」 我正在將Firebase標題導入函數所在的VC。將數據下載到內存中的FirebaseStorage問題(Swift)

func getImage(imageName: String) -> UIImage { 
    let imageRef = kBucketRef.child(imageName) 
    print(imageRef) 
    var imageData: NSData? 
    var image: UIImage? 
    imageRef.dataWithMaxSize(200 * 1024) { (data, error) -> Void in 
     if (error != nil) { 
     imageData = data 
     image = UIImage(data: imageData!) 
     } else { 
      print(error?.localizedDescription) 
     } 
    } 
    return image! 
} 

後試圖顯示圖像時:image.image =的getImage(imageName)被調用它的回報圖像拋出提到的錯誤!

fatal error: unexpectedly found nil while unwrapping an Optional value

Printing description of imageRef: expression produced error: /var/folders/9q/g2rz2_hj15548cf15yrxz37c0000gn/T/lldb/1645/expr11.swift:1:46: error: use of undeclared type 'FirebaseStorage' $__lldb__DumpForDebugger(Swift.UnsafePointer< FirebaseStorage.FIRStorageReference >(bitPattern: 0x11d028fa0).memory) ^~~~~~~~~~~~~~~ /var/folders/9q/g2rz2_hj15548cf15yrxz37c0000gn/T/lldb/1645/expr11.swift:1:45: note: while parsing this '<' as a type parameter bracket $__lldb__DumpForDebugger(Swift.UnsafePointer(bitPattern: 0x11d028fa0).memory)

從輸出 '打印(imageRef)' 打印GS引用(GS://項目-XXXXXX ......),但 '.dataWithMaxSize()' 未能預先

謝謝


(天后) 好吧,這裏是一個解決辦法,因爲FIRStorage方法不是在以後回報分離功能修改瓦爾:

let bucket: String = "gs://mystoragetesterxxxxxx.appspot.com" 


func getImage() { 

    let storage = FIRStorage.storage() 
    let storageRef = storage.referenceForURL(bucket) 
    let path = storageRef.child("photo.jpg") 
    print(path) 
    path.dataWithMaxSize(1024 * 1024) { (data, error) in 
     if (error != nil) { 
      print(error!.localizedDescription) 
     } else { 
      self.imageView.image = UIImage(data: data!) 
     } 
    } 

} 

現在的getImage這是一個無效的功能,但它的工作原理

回答

1

你確定這是不是隻是你在哪裏聲明一個可選類型的問題:

var image: UIImage?

然後調用異步函數

imageRef.dataWithMaxSize...

,然後無需等待它返回一個隱含展開可選?

return image!

我看來,像因爲圖像是零,你是「意外展開一零」,即非常依賴的競爭條件才能成功。

我想嘗試更多的東西一樣:

var image: UIImage? 
imageRef.dataWithMaxSize(200 * 1024) { (data, error) -> Void in 
    if (error != nil) { 
     return UIImage(data: data!)! 
    } else { 
     print(error?.localizedDescription) 
    } 
} 

雖然在一般,包裝一個異步調用,並試圖使其同步是一個壞主意(除非你實現類似的承諾) - 你應該使用異步調用,然後在主線程上更新UI元素。

+0

根據你的建議改變了函數,它拋出nil,存儲的文件路徑是正確的,那裏有一個文件,但它仍然沒有分配給「數據」,存儲桶被配置爲公共。 它不會觸發(error!= nil)條件,它只是不下載圖像 –

1

嘗試這樣的事情

let storage = FIRStorage.storage() 

則函數

func getImage(imageName: String) -> UIImage { 
     let gsReference = storage.referenceForURL(imageName!) 

     print(imageRef) 
     var imageData: NSData? 
     var image: UIImage? 
     let downloadTask = gsReference.dataWithMaxSize(200 * 1024) { (data, error) -> Void in 
      if (error != nil) { 
      //imageData = data 
      //image = UIImage(data: imageData!) 

      let image = UIImage.init(data: data!) 

      } else { 
       print(error?.localizedDescription) 
      } 

      downloadTask.observeStatus(.Resume) { (snapshot) -> Void in 
       print("Downloading has started") 


      } 
     } 
    return image! 
} 

然後你在日誌中看到,如果下載已經開始。

+0

在下載任務之前,我可以打印存儲引用完整路徑:gs://project-xxxxxx163293.appspot.com/images /xxxxxx.jpg,所以引用是好的 在dataWithMaxSize:完成我在if之前添加了一個print(「dataWithMaxSize running」)語句,然後下一個控制檯輸出是返回圖像行中的「found nil」錯誤,我在想這個任務沒有運行,當圖像:UIImage?從返回中調用它是零,因此是錯誤。 –