Mekal Z

Mekal Z

A programmer running out of the wall.
twitter

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

画像

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)でも保存することができます。

画像を保存する際には、常にアプリのドキュメントディレクトリの URL を使用する必要があることに注意してください。この例では、FileManager.default.urls (for: .documentDirectory, in: .userDomainMask).first を使用してドキュメントディレクトリの URL を取得しています。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。