我正在尝试从ios应用程序swift中的url加载图像。我已经编写了以下代码。
let imageURL = minHost + "\(userData["profileImage"])"
let url = URL(string: imageURL)!
let imageData = try? Data(contentsOf: url)
profileImage.image = UIImage(data: imageData!)
现在imageURL具有正确的url,但是imageData接收到nil
,因此,最后一行出现了错误Fatal error: Unexpectedly found nil while unwrapping an Optional value
答案 0 :(得分:2)
使用Data(contentsOf:)
进行网络调用,而不是使用URLSession
方法获取图像。
let imageURL = minHost + "\(userData["profileImage"])"
if let url = URL(string: imageURL) {
URLSession.shared.dataTask(with: url) {[weak self] (data, urlResponse, error) in
if let data = data {
DispatchQueue.main.async {
self?.profileImage.image = UIImage(data: imageData)
}
}
}.resume()
}
重要说明:避免不必要地使用forced unwrapping (!)
。这可能会导致不必要的应用崩溃。而是使用guard
或if-let
来解开optionals
。
答案 1 :(得分:1)
在Playground尝试一下。 从URL加载图像需要一些时间,并且需要在不同于主线程的另一个线程上执行。
import UIKit
let url = URL(string: "https://cdn.arstechnica.net/wp-content/uploads/2018/06/macOS-Mojave-Dynamic-Wallpaper-transition.jpg")!
var image = UIImage()
DispatchQueue.global().async {
if let data = try? Data(contentsOf: url) {
DispatchQueue.main.async {
image = UIImage(data: data)!
}
}
}
image
答案 2 :(得分:0)
您可以尝试这样:
{{1}}
答案 3 :(得分:0)
尝试一下
let url = URL(string:imageURL)
if let data = try? Data(contentsOf: url!)
{
profileImage.image = UIImage(data: data, scale: 1.0)!
}
答案 4 :(得分:0)
永远不要在主线程上执行下载任务。如果这样做,将无法正确访问当前可见屏幕中的组件。它应该总是在后台线程上。
if let url = URL(string: "https://....") {
DispatchQueue.global(qos: .background).async {
if let data = try? Data(contentsOf: url) {
if let image = UIImage(data: data) {
DispatchQueue.main.async {
self.profileImage.image = image
}
}
}
}
}