Mekal Z

Mekal Z

A programmer running out of the wall.
twitter

如何在 swiftUI 中从网络下载一张图片并存放在本地?

image

SwiftUI 开发笔记

在 SwiftUI 中,我们可以使用 URLSession 来从网络下载图片,并使用 FileManager 将其保存在本地。以下是一个示例代码,演示了如何在 SwiftUI 中下载并保存一张图片:

import SwiftUI

struct ContentView: View {
    @State private var image: UIImage?
    
    var body: some View {
        if let image = image {
            Image(uiImage: image)
                .resizable()
                .aspectRatio(contentMode: .fit)
        } else {
            Text("Loading...")
                .onAppear {
                    // Download and save the image
                    downloadImage(from: URL(string: "https://example.com/image.png")!) { result in
                        switch result {
                        case .success(let image):
                            saveImage(image, withName: "image.png")
                            self.image = image
                        case .failure(let error):
                            print(error.localizedDescription)
                        }
                    }
                }
        }
    }
    
    // Download an image from the specified URL and call the completion handler with the result
    func downloadImage(from url: URL, completion: @escaping (Result<UIImage, Error>) -> Void) {
        URLSession.shared.dataTask(with: url) { data, response, error in
            guard let data = data, let image = UIImage(data: data) else {
                completion(.failure(error ?? NSError(domain: "Unknown", code: 0)))
                return
            }
            completion(.success(image))
        }.resume()
    }
    
    // Save the specified image to the app's documents directory with the specified name
    func saveImage(_ image: UIImage, withName name: String) {
        guard let data = image.pngData(),
              let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
            return
        }
        let fileURL = documentsDirectory.appendingPathComponent(name)
        do {
            try data.write(to: fileURL)
        } catch {
            print(error.localizedDescription)
        }
    }
}

在上面的代码中,我们使用 @State 属性包装器来存储已下载的图像。在视图中,我们首先检查是否已经下载了图像,如果是,则将其显示在 Image 中。否则,我们显示 "Loading..." 文本,并在 onAppear 修饰符中调用 downloadImage 方法来下载图像。一旦图像下载完成,我们使用 saveImage 方法将其保存在本地,然后将其设置为 @State 属性,以便在 Image 中显示。

在 downloadImage 方法中,我们使用 URLSession 来下载图像,并将结果作为 Result 类型传递给完成处理程序。在 saveImage 方法中,我们使用 FileManager 将图像保存在本地。请注意,这里我们将图像保存为 PNG 格式,但您也可以将其保存为其他格式(例如 JPEG)。

请注意,在使用 FileManager 保存图像时,应始终使用应用程序文档目录的 URL。在本例中,我们使用 FileManager.default.urls (for: .documentDirectory, in: .userDomainMask).first 来获取文档目录的 URL。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。