如何在iOS Swift中显示来自URL的图像

时间:2019-05-22 08:56:20

标签: ios swift uiimage

我正在尝试从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

5 个答案:

答案 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 (!)。这可能会导致不必要的应用崩溃。而是使用guardif-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
                    }
                }
            }
        }
    }