2

我有一个应用程序,它从数据库中提取图像的 url 并将其存储在 coredata 中。然后在我的应用程序视图中,有一个图像视图的滚动视图,基本上我正在尝试做一个图像滑块。这些图像往往会更新,因此需要从服务器加载。我从 coredata 加载图像 url,将它们下载到 uiimages 并在我的视图中加载它们。问题是,它真的很慢,因为我在运行时这样做。

我想知道解决这个问题的最佳方法是什么。我想在应用程序启动时先将所有图像加载到手机上?我尝试寻找一些示例代码来指向正确的方向,但我只能找到将图像保存到手机相机胶卷而不是应用程序本身的代码。任何人都可以帮忙吗?谢谢!

4

2 回答 2

1

这是一个方法,它采用 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 文件夹中是否存在图像文件的方法。displayedImageViewUIImageView您用来显示图像的。

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);
        });
    });

}
于 2013-09-25T05:09:52.840 回答
0

您可能不需要将图像下载到您的应用程序,我可以建议您更好地使用图像 url 它自己从服务器加载图像。

要从服务器加载图像,您可以使用以下内容:

UIImage* yourImageview = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:your.image_url]]];

下载所有图像也会减慢您的应用程序。

于 2013-09-25T05:15:11.203 回答