2016-11-30 182 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