ios快速与服务器的图像缓存

时间:2014-07-21 07:35:05

标签: ios objective-c caching uiimage

我正在尝试使用Path's FastImageCache library来处理我的应用中的照片。他们提供的样本只是从磁盘读取图像。有谁知道如何修改它以从网址读取?在关于providing source images to the cache的部分中,他们有

- (void)imageCache:(FICImageCache *)imageCache wantsSourceImageForEntity:(id<FICEntity>)entity withFormatName:(NSString *)formatName completionBlock:(FICImageRequestCompletionBlock)completionBlock {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // Fetch the desired source image by making a network request
        NSURL *requestURL = [entity sourceImageURLWithFormatName:formatName];
        UIImage *sourceImage = [self _sourceImageForURL:requestURL];

        dispatch_async(dispatch_get_main_queue(), ^{
            completionBlock(sourceImage);
        });
    });
}    

有没有人之前使用过这个api并且知道如何从服务器获取源以传递到缓存?另一个仍然使用硬盘的例子是

- (void)imageCache:(FICImageCache *)imageCache wantsSourceImageForEntity:(id<FICEntity>)entity withFormatName:(NSString *)formatName completionBlock:(FICImageRequestCompletionBlock)completionBlock {
    // Images typically come from the Internet rather than from the app bundle directly, so this would be the place to fire off a network request to download the image.
    // For the purposes of this demo app, we'll just access images stored locally on disk.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        UIImage *sourceImage = [(FICDPhoto *)entity sourceImage];
        dispatch_async(dispatch_get_main_queue(), ^{
            completionBlock(sourceImage);
        });
    });
}

3 个答案:

答案 0 :(得分:2)

当我在Path时,我在Fast Image Cache上工作。快速图像缓存的关键部分是它是从磁盘上的图像数据到Core Animation渲染的绝对最快的方式。没有解码,您的应用程序不会将任何图像数据保存在内存中,也不会出现图像副本。

那就是说,你有责任弄清楚如何下载图像。下载图像没有什么特别之处。您可以使用NSURLConnection或许多常用网络库之一(如AFNetworking)实际从服务器下载图像数据。获得该图像数据后,可以调用快速图像缓存的相关完成块,使其优化以供将来渲染。

如果您正在寻找一种简单的方式来下载图像并在完成后显示图像,那么请使用类似SDWebImage的内容。对于像这样的简单案例来说,它非常棒。如果您遇到性能瓶颈 - 特别是滚动 - 由于您的应用需要快速显示大量图像,那么快速图像缓存非常适合您。

答案 1 :(得分:0)

你的方法看起来很像懒人从URL加载图片,我必须这样做一旦我使用下面的库来做它,它将图像存储在磁盘中,但使用缓存的图像..下面是它的链接.. https://github.com/nicklockwood/AsyncImageView

答案 2 :(得分:0)

我将网络逻辑添加到我们的fork&gt; https://github.com/DZNS/FastImageCache#dezine-zync-additions-to-the-class

它使用NSURLSessionDownloadTasks,有几个配置选项(可选)。您需要做的就是创建一个DZFICNetworkController的新实例,并将其设置为FICImageCache的sharedCache实例对象的委托。它会照照符合sourceImageURLWithFormatName:的对象上的<FICEntity>方法来下载图像。

我假设您在UITableViewUICollectionView中使用此功能,在imageCache上调用cancelImageRetrievalForEntity:withFormatName:将取消下载操作(如果它仍处于运行中或尚未启动)。