在 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。您可以根据需要使用这些方法。

更新于: 2023年1月2日

7K+ 阅读量

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.