如何在iOS上的AFNetworking中启用磁盘缓存

时间:2015-09-06 20:45:38

标签: ios amazon-s3 afnetworking afnetworking-2 cache-control

在我的iOS应用程序中,我是AFNetworking提供的UIImageView类别,用于下载存储在Amazon S3上的图像。我认为默认缓存默认存储在磁盘上的缓存图像,但是,由于多种原因(缺少HTTP头等),我意识到我错了。图像似乎不会被缓存,每次执行时都会下载它们。

因此,我现在正在尝试自定义缓存,如http://blog.originate.com/blog/2014/02/20/afimagecache-vs-nsurlcache/

所示

这是我迄今为止所做的事情(似乎有效):

1)定义了一个名为PlayerImageCache的自定义NSURLCache,并在我的app委托中初始化它,以便使用5MB内存和最多100MB的磁盘空间

PlayerImageCache *sharedCache = [[PlayerImageCache alloc] initWithMemoryCapacity:5*1024*1024 diskCapacity:100*1024*1024 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];

2)覆盖了storeCachedResponse方法,以便始终缓存我的图像

- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse
                 forRequest:(NSURLRequest *)request
{
    if ([request.URL.absoluteString hasPrefix:playersImagesPrefix])
    {
        NSCachedURLResponse *modifiedCachedResponse = [[NSCachedURLResponse alloc] initWithResponse:cachedResponse.response data:cachedResponse.data userInfo:cachedResponse.userInfo storagePolicy:NSURLCacheStorageAllowed];
        [super storeCachedResponse:modifiedCachedResponse forRequest:request];
    }
    else
    {
        [super storeCachedResponse:cachedResponse forRequest:request];
    }
}

3)在使用NSURLRequestReturnCacheDataElseLoad策略下载图像之前强制每个请求检查缓存

NSURLRequest *imageRequest = [NSURLRequest requestWithURL:[NSURL urlForPlayer:self.playerId] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60];
[self.playerImage setImageWithURLRequest:imageRequest placeholderImage:[UIImage imageNamed:@"playerprofile"] success:nil failure:nil];

这还够吗?我是否需要进一步自定义缓存?即使没有Cache-Control HTTP标头,这是否可行?

1 个答案:

答案 0 :(得分:0)

答案是肯定的!它就像一个魅力。由于这个技巧,我设法大大减少了请求的数量。