在Swift中从一个URL加载/下载图片
在这篇文章中,你将学习如何用Swift语言从URL下载图片。
在iOS应用程序中,从图片URL下载图片是最常见的任务。苹果为我们提供了一个本地库,可以从任何URL下载任何数据。在GitHub上有许多第三方库可以用来下载图片。
但在本教程中,我们不打算使用任何第三方库。我们将使用苹果公司自己提供的URLSession类。
什么是URLSession类
URLSession是Foundation框架中的一个类,它为通过网络连接从服务器下载数据和向服务器上传数据提供了一个API。它使用一个URL来识别资源的位置,并可用于执行各种网络请求,包括GET、POST、PUT和DELETE。
示例
下面是一个例子,说明你如何使用URLSession在Swift中发出GET请求。
import UIKit
let url = URL(string: "url_string")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
// handle error
return
}
guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else {
// handle error
return
}
if let data = data {
// process data
}
}
task.resume()
这段代码创建了一个代表API端点的URL对象,然后使用URLSession的dataTask(with:)方法创建一个dataTask。dataTask向服务器发送一个GET请求,并在响应中检索数据。完成处理程序在请求完成时被调用,它接收数据、响应和错误作为参数。
你可以使用响应和数据对象来处理服务器的响应并根据需要处理数据。
要在 Swift 中从 URL 中加载图像,你将使用相同的 URLSession 类来向托管图像的服务器发送请求。然后你将使用响应中的数据,用UIImage类创建一个图像。
下面是一个例子,说明你可以如何做到这一点
算法
第1步 – 创建一个ImageDownloader类和一个方法downloadImage()。
第2步 – 检查一个有效的URL对象,否则返回。
第3步 – 调用URLSession类的dataTask()方法。
第4步 – 在dataTask()方法中实现完成回调。
第5步 – 在进入下一步之前,检查是否有错误。
第6步 – 用if-let将收到的数据转换成UIImage对象。
示例
import UIKit
class ImageDownloader {
static func downloadImage(_ urlString: String, completion: ((_image: UIImage?, _ urlString: String?) -> ())?) {
guard let url = URL(string: urlString) else {
completion?(nil, urlString)
return
}
URLSession.shared.dataTask(with: url) { (data, response,error) in
if let error = error {
print("error in downloading image: \(error)")
completion?(nil, urlString)
return
}
guard let httpResponse = response as? HTTPURLResponse,(200...299).contains(httpResponse.statusCode) else {
completion?(nil, urlString)
return
}
if let data = data, let image = UIImage(data: data) {
completion?(image, urlString)
return
}
completion?(nil, urlString)
}.resume()
}
}
解释
在上面的例子中,你可以看到,在进一步进行之前验证URL对象总是一个可行的选择。一旦请求完成,完成
处理程序给你数据、响应和错误。在从数据中得到一个有效的图像之前,验证是否收到了错误。
示例
import UIKit
class TestViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.layer.cornerRadius = 16
imageView.layer.masksToBounds = true
imageView.backgroundColor = UIColor(white: 0, alpha: 0.1)view.addSubview(imageView)
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.widthAnchor.constraint(equalToConstant: 250).isActive = true
imageView.heightAnchor.constraint(equalToConstant:250).isActive = true
imageView.centerXAnchor.constraint(equalTo:view.centerXAnchor).isActive = true
imageView.centerYAnchor.constraint(equalTo:
view.centerYAnchor).isActive = true
ImageDownloader.downloadImage("https://picsum.photos/300") {
image, urlString in
if let imageObject = image {
// performing UI operation on main thread
DispatchQueue.main.async {
imageView.image = imageObject
}
}
}
}
}
注意,这段代码使用了URLSession的dataTask方法来异步执行请求。这意味着图像将在后台加载,而主线程不会被阻塞。这对于确保你的应用程序在加载图片时保持响应是很重要的。
输出
结论
请注意,URLSession还提供了其他执行网络请求的方法,比如uploadTask用于向服务器上传数据,downloadTask用于从服务器下载数据。你可以根据你的需要使用这些方法。