这是一个方法,它采用 a UIImage
、目标路径(您要将图像保存到的目录)和图像的文件名,并将图像保存为 PNG 文件:
-(BOOL) saveImage:(UIImage *)image savePath:(NSString *)savePath filename:(NSString *)filename{
savePath = [savePath stringByAppendingPathComponent:filename];
NSData *sourceData = UIImagePNGRepresentation(image);
return [sourceData writeToFile:savePath atomically:YES];
}
您需要将图像存储在应用程序沙箱内的正确位置。例如,不要将它们放在 Documents 文件夹中,因为它可能会被 Apple 拒绝,因为您可以重新创建(或重新下载)图像。您可能希望将它们放在 Library/Caches 文件夹中,并准备好在它们被删除时重新下载它们。有关这方面的详细信息,请参阅iOS 文件系统编程指南。
我会担心在应用程序启动时下载所有文件,因为如果它在下载许多图像文件时无响应,它看起来就像应用程序已冻结。您可以在后台下载图像并在图像完成下载后更新 UI。
一种方法是检查图像是否已经下载(例如,它是否在 Library/Caches 文件夹中)。如果是,则使用它,否则使用占位符图像,直到下载图像。例如:
if (isImageAvailable) {
displayedImageView.image = cachedImage;
} else {
displayedImageView.image = placeholderImage;
[self getImageAtURL:imageURL andThenDo:^(UIImage *image) {
// Replace placeholder image with downloaded image
displayedImageView.image = image;
}];
}
替换isImageAvailable
为检查 Library/Caches 文件夹中是否存在图像文件的方法。displayedImageView
是UIImageView
您用来显示图像的。
该getImageAtURL
方法看起来像:
-(void)getImageAtURL:(NSURL *)url andThenDo:(void(^)(UIImage *image))completionBlock{
// Run on background thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImage *image;
// Insert code to download image...
// Switch to main (UI) thread to allow updating the UI
dispatch_sync(dispatch_get_main_queue(), ^{
completionBlock(image);
});
});
}