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。