2016-11-30 20 views
0

Firebaseストレージからイメージをダウンロードしようとしています。Firebase Storage Imageダウンロード

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

私はreturn thumbラインで

fatal error: unexpectedly found nil while unwrapping an Optional value

を持ってこのコードを実行します。

返信の代わりにprint(thumbnailUrl)のみを実行すると、正しいサムネイルURLが印刷されます。なぜこのエラーが出るのか誰にでも知ることができますか?

ありがとうございました。

答えて

2

親指がゼロになることは保証できません。このため、あなたは使ってはいけません!あなたはそれを制御できず、手動で設定していないので、オプションにする必要があります。

var thumb: URL? 

次に、インターネット通話があります。あなたはその呼び出しからの応答を得る前に親指を返すのです。そのため、親指は無名ですが、あなたは私たちに!それは不可能なので、あなたはクラッシュします。

ブレークポイントを設定すると、if error != nil行をヒットする前に、メソッド上でreturn thumbをヒットすることに気付くはずです。このメソッドはfirebaseからの応答を得る前に常に返されるため、戻り値は使用できません。そのため、URLは常にゼロになります。私は代わりに完成の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 
    } 
    } 
} 

このアプリのデザインパターンと一致しない場合、私に知らせてください。私はあなたがテーブルビューを使用していたと仮定し、これらのメソッドは異なるクラスにある可能性があります。

+0

おかげで素晴らしいです:) – Brkr

関連する問題