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("載入中...")
                .onAppear {
                    // 下載並保存圖片
                    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)
                        }
                    }
                }
        }
    }
    
    // 從指定的 URL 下載圖片並呼叫完成處理程序處理結果
    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()
    }
    
    // 將指定的圖片保存到應用程式的文件目錄中,並指定名稱
    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 中。否則,我們顯示 "載入中..." 文字,並在 onAppear 修飾符中呼叫 downloadImage 方法來下載圖像。一旦圖像下載完成,我們使用 saveImage 方法將其保存在本地,然後將其設置為 @State 屬性,以便在 Image 中顯示。

在 downloadImage 方法中,我們使用 URLSession 來下載圖像,並將結果作為 Result 類型傳遞給完成處理程序。在 saveImage 方法中,我們使用 FileManager 將圖像保存在本地。請注意,這裡我們將圖像保存為 PNG 格式,但您也可以將其保存為其他格式(例如 JPEG)。

請注意,在使用 FileManager 保存圖像時,應始終使用應用程式文件目錄的 URL。在本例中,我們使用 FileManager.default.urls (for: .documentDirectory, in: .userDomainMask).first 來獲取文件目錄的 URL。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。