我有一个Firebase数据库,其中包含我的图片网址。我试图根据配置文件用户名调用配置文件图像。我从profileImageURL获取正确的URL,但每当我启动URLSession时,它总是显示为nil。这是我的代码:
if let profileImageURL = user.profileImageURL{
let url = URL(string: profileImageURL)
URLSession.shared.dataTask(with: url!, completionHandler: { ( data, response, error) in
//Download Hit an Error
if error != nil {
print(error!)
return
}
DispatchQueue.main.async() {
cell.profileNameImageView?.image = UIImage(data: data!)
}
})
}
示例网址字符串:
答案 0 :(得分:3)
将if-let
阻止与网址初始化一起使用。此错误的原因是url的可选实例 - init?(string: String)。您profileImageURL
可能不是有效的网址字符串,因此网址初始化程序无法生成类URL
的实例并返回nil,您尝试使用!
解包。
试试这个并看看。
if let profileImageURL = user.profileImageURL{
// Use if-let block with URL initialiser.
if let url = URL(string: profileImageURL) { // try this - if let url = URL(string: "gs://instagram-caption-generator.appspot.com/FeaturedAccounts/ProfileImage/featured_2.jpg") {
// Remove unwrapper !, from url
URLSession.shared.dataTask(with: url, completionHandler: { ( data, response, error) in
//Download Hit an Error
if error != nil {
print(error!)
return
}
if let imageData = data {
DispatchQueue.main.async() {
cell.profileNameImageView?.image = UIImage(data: imageData)
}
} else {
print("image data is nil")
}
}).resume()
} else {
print("url is nil")
}
}
答案 1 :(得分:1)
您可以使用guard
或if let
语句并展开profileImageURL
并在一次扫描中验证它实际上是有效的网址,如下所示:
guard let profileImageURL = user.profileImageURL,
let url = URL(string: profileImageURL) else { return }
// now you know that url is definitely a valid URL
URLSession.shared.dataTask(with: url, completionHandler: { ( data, response, error) in
//Download Hit an Error
if error != nil {
print(error!)
return
}
DispatchQueue.main.async() {
cell.profileNameImageView?.image = UIImage(data: data!)
}
})
为您节省解缠导致问题的力量!
(正如您刚刚发现的那样)。
希望有所帮助。