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。