我有一个应用程序,它从数据库中提取图像的 url 并将其存储在 coredata 中。然后在我的应用程序 View 中,有一个 ImageView 的 ScrollView ,基本上我正在尝试做一个图像 slider 。这些图像往往会更新,因此需要从服务器加载。我从 coredata 加载图像 url,将它们下载到 uiimages 并在我的 View 中加载它们。问题是,它真的很慢,因为我在运行时这样做。
我想知道解决此问题的最佳方法是什么。我想在应用程序启动时先将所有图像加载到手机上?我尝试寻找一些示例代码来指向正确的方向,但我只能找到将图像保存到手机相机胶卷而不是应用程序本身的代码。任何人都可以帮忙吗?谢谢!
Best Answer-推荐答案 strong>
这是一个方法,它采用 UIImage 、目标路径(您要保存图像的目录)和图像的文件名,并将图像保存为 PNG 文件:
-(BOOL) saveImageUIImage *)image savePathNSString *)savePath filenameNSString *)filename{
savePath = [savePath stringByAppendingPathComponent:filename];
NSData *sourceData = UIImagePNGRepresentation(image);
return [sourceData writeToFile:savePath atomically:YES];
}
您需要将图像存储在应用沙箱内的正确位置。例如,不要将它们放在 Documents 文件夹中,因为它可能会被 Apple 拒绝,因为您可以重新创建(或重新下载)图像。您可能希望将它们放在 Library/Caches 文件夹中,并准备好在它们被删除时重新下载它们。见 iOS File System Programming Guide有关详细信息。
我会担心在应用程序启动时下载所有文件,因为如果在下载大量图像文件时应用程序无响应,它会看起来像已卡住。您可以在后台下载图片,并在图片下载完成后更新 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)getImageAtURLNSURL *)url andThenDovoid(^)(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);
});
});
}
关于ios - 将图像从 Web 服务器保存到手机以获取图像 slider ,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/18995691/
|