This question already has answers here:
What does “fatal error: unexpectedly found nil while unwrapping an Optional value” mean?
(11个答案)
两年前关闭。
我正在尝试从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))

当我运行这个代码时
致命错误:在展开可选值时意外找到nil
return thumb线。
但如果我只运行print(thumbnailUrl)而不是return,它会打印正确的缩略图url。有人知道我为什么会犯这个错误吗?
谢谢。

最佳答案

你不能保证拇指永远不会是零。因此,你不应该使用!。因为您无法控制它,也没有手动设置,所以需要将其设置为可选。

var thumb: URL?

其次,你有一个网络电话。在接到那个电话的回复之前,您正在返回thumb,因此thumb为零,但您告诉了我们!那是不可能的,所以你崩溃了。
如果您放置了断点,您应该注意到在您点击return thumb行之前,您将在您的方法上点击if error != nil。不能对此使用返回,因为该方法总是在从firebase获得响应之前返回,因此您的URL将始终为nil。相反,我会在完成后发送一个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,并且这些方法可能在不同的类中。

关于ios - Firebase存储镜像下载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40878301/

10-13 04:24