我有一个我的图像URL所在的firebase数据库。我正在尝试根据配置文件用户名调用配置文件图像。我从ProfileMimageurl那里获得了正确的URL,但是每当我启动urlsession时,总是会显示零。这是我的代码:
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!)
}
})
}
样本URL字符串:
https://firebasestorage.googleapis.com/v0/b/instagram-caption-generator.appspot.com/o/featsudaccounts/profileimage/featured_2.jpg?-A4044921C075
使用URL初始机使用if-let
块。此错误的原因是URL的可选实例 - init?(string:string)。您的profileImageURL
可能不是有效的URL字符串,因此URL初始机无法制作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")
}
}
您可以使用 guard
或 if let
语句,然后unwrap profileImageURL
and 验证它实际上是一个有效的URL,例如So:
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!)
}
})
节省了拆开的!
的力,这会导致您问题(如您刚刚发现的那样)。
希望会有所帮助。