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 を取得しています。