Swift 下载网络图片保存本地

在开发iOS应用程序时,有时候我们需要从网络上下载图片并保存到本地。Swift提供了方便的方法来实现这个功能。本文将介绍如何使用Swift下载网络图片并保存到本地,并提供相应的代码示例。

准备工作

在开始编写代码之前,我们需要导入UIKitFoundation框架,因为我们将使用这两个框架中的类和方法来实现下载和保存图片的功能。

import UIKit
import Foundation

下载图片

首先,我们需要创建一个函数来下载图片。我们将使用URLSession类和dataTask(with:)方法来完成这个任务。

func downloadImage(fromUrl url: URL, completion: @escaping (UIImage?) -> Void) {
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard let data = data, error == nil else {
            completion(nil)
            return
        }
        
        let image = UIImage(data: data)
        completion(image)
    }.resume()
}

在上面的代码中,我们使用URLSession.shared.dataTask(with:)方法来创建一个数据任务。在任务完成后,我们检查数据和错误。如果数据非空且没有错误,我们使用UIImage(data:)方法将数据转换为图片。最后,我们将图片传递给回调函数。

保存图片

接下来,我们需要创建一个函数来保存图片到本地。我们将使用UIImageWriteToSavedPhotosAlbum(_:_:_:_:)方法来实现这个功能。

func saveImage(_ image: UIImage, completion: @escaping (Bool) -> Void) {
    UIImageWriteToSavedPhotosAlbum(image, self, #selector(imageSaved(_:error:context:)), nil)
}

@objc func imageSaved(_ image: UIImage, error: Error?, context: UnsafeMutableRawPointer?) {
    if let error = error {
        completion(false)
        return
    }
    
    completion(true)
}

在上面的代码中,我们首先调用UIImageWriteToSavedPhotosAlbum(_:_:_:_:)方法将图片保存到系统相册中。当保存完成时,系统会调用名为imageSaved(_:error:context:)的回调方法。在回调方法中,我们检查是否有错误并相应地调用回调函数。

示例

现在我们已经准备好了下载和保存图片的函数,我们可以在示例代码中使用它们了。

let imageUrl = URL(string: "

downloadImage(fromUrl: imageUrl) { image in
    guard let image = image else {
        print("下载图片失败")
        return
    }
    
    saveImage(image) { success in
        if success {
            print("图片保存成功")
        } else {
            print("图片保存失败")
        }
    }
}

在上面的代码中,我们首先创建一个URL对象来表示要下载的图片的URL。然后,我们调用downloadImage(fromUrl:)函数来下载图片。在下载完成后,我们检查下载结果并调用saveImage(_:)函数来保存图片。在保存完成后,我们打印相应的信息。

序列图

下面是下载和保存图片的过程的序列图。

sequenceDiagram
    participant App
    participant URLSession
    participant UIImageWriteToSavedPhotosAlbum
    participant System
    
    App->>URLSession: 创建数据任务
    URLSession->>System: 下载图片数据
    System-->>URLSession: 返回图片数据
    URLSession->>App: 传递图片数据
    App-->>UIImageWriteToSavedPhotosAlbum: 保存图片
    UIImageWriteToSavedPhotosAlbum-->>System: 图片保存完成
    System-->>App: 返回保存结果
    App->>App: 处理保存结果

在上面的序列图中,我们可以看到下载和保存图片的过程中各个参与方之间的交互。

总结

通过本文,我们学习了如何使用Swift下载网络图片并保存到本地。我们创建了两个函数,一个用于下载图片,另一个用于保存图片。我们还提供了相应的代码示例,并使用序列图展示了整个过程。希望本文对你有所帮助!