2016-11-30 183 views
0

我正在嘗試從Firebase存儲下載圖像。Firebase存儲圖像下載

func downloadThumbnail(thumbnail: String) -> URL { 
    var thumb: URL! 
    let _ = DataService.dataService.TAG_PHOTO_REF.child("\(thumbnail)").downloadURL { (thumbnailUrl, error) in 
     if error != nil { 
      print(error?.localizedDescription as Any) 
     } else { 
      thumb = thumbnailUrl 
     } 
    } 
    return thumb 
} 

cell.photo.kf.setImage(with: downloadThumbnail(thumbnail: selectedTag.thumbnail)) 

當我運行這段代碼我

fatal error: unexpectedly found nil while unwrapping an Optional value

return thumb線。

但是,如果我只運行print(thumbnailUrl)而不是返回,它會打印正確的縮略圖網址。任何人都可以知道爲什麼我有這個錯誤?

感謝。

回答

2

你不能保證拇指永遠不會是零。正因爲如此,你不應該使用!由於您無法控制它並且沒有手動設置,因此您需要將其設置爲可選項。

var thumb: URL? 

其次,你有一個互聯網電話。在您收到該電話的回覆之前,您正在返回拇指,因爲這樣,拇指是零,但您告訴我們!那是不可能的,所以你崩潰了。

如果你輸入了斷點,你應該注意到你會在你的方法上點擊return thumb,然後你點擊if error != nil行。您無法爲此使用回報,因爲該方法始終會在它從Firebase獲得響應之前返回,因此您的網址始終爲零。我會在完成時發送一個URL。

我還沒有檢查過firebase代碼,但如果一切正常,這就是你想要的順序。

所以:

func downloadThumbnail(thumbnail: String,withCompletion comp: @escaping (URL?, Error?) ->()) { 
    let _ = DataService.dataService.TAG_PHOTO_REF.child("\(thumbnail)").downloadURL { (thumbnailUrl, error) in 
    if error != nil { 
     print(error?.localizedDescription as Any) 
     comp(nil, error) 
    } else { 
     comp(thumbnailUrl, nil) 
    } 
    } 
} 

所以,當你把它叫做別的地方:

func getMyImage(cell: UITableViewCell) { 
    downloadThumbnail(thumbnail: selectedTag.thumbnail) { (thumbnailUrl, error) in 
    if error != nil { 
     //show some sort of alert for the user here? or do something to handle the error? 
    } else { 
     //the url is an optional URL, so check to make sure it isn't nil 
     if let url = thumbnailUrl { 
     cell.photo.kf.setImage(with: url) 
     } else { 
     //you didn't get an error from your firebase response 
     //but the thumbnail url it gave you is broken for some reason 
     //so again, do something about your error here 
    } 
    } 
} 

如果這不符合您的應用程序的設計模式,讓我知道。我認爲你使用的是tableview,這些方法可能在不同的類中。

+0

非常感謝:) – Brkr