在 Swift 中加载/下载 URL 中的图像
在本文中,您将学习如何在 Swift 语言中从 URL 下载图像。
在 iOS 应用程序中,从图像 URL 下载图像是最常见的任务。Apple 为我们提供了一个原生库来从任何 URL 下载任何数据。GitHub 上还有许多第三方库可用于下载图像。
但在本教程中,我们不会使用任何第三方库。我们将使用 Apple 自身提供的 URLSession 类。
什么是 URLSession 类?
URLSession 是 Foundation 框架中的一个类,它提供了一个 API 用于通过网络连接从服务器下载数据和上传数据到服务器。它使用 URL 来识别资源的位置,并且可以用于执行各种网络请求,包括 GET、POST、PUT 和 DELETE。
示例
以下是如何在 Swift 中使用 URLSession 发出 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 请求并检索响应中的数据。当请求完成时,会调用 completion handler,它接收数据、响应和错误作为参数。
您可以使用 response 和 data 对象来处理服务器的响应并根据需要处理数据。
要在 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 对象始终是一个可行的选择。请求完成后,completion
handler 会提供数据、响应和错误。在从数据中获取有效图像之前,请验证是否收到了错误。
示例
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。您可以根据需要使用这些方法。
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP