如何使用AFNetworking缓存文件下载?

时间:2013-08-27 09:12:48

标签: ios objective-c afnetworking

我正在尝试下载一些文件。

对于每个单元格,我检查文件是否存在并且已经存储在目录中,如果不是,我会下载它。

但我也下载了几个单元格的文件。

如果我正在尝试提前为不可见的单元格下载文件,但是用户滚动到单元格并且文件尚未完全下载,会发生什么。

无论如何都要阻止它下载两次? 无论如何都知道该文件已经下载了吗?

我正在使用AFNetworking。

1 个答案:

答案 0 :(得分:4)

您尝试做的事情有一个名称,而且缓存

AFNetworking已根据official FAQs

实施
  

AFNetworking是否内置了任何缓存机制?

     

AFNetworking利用NSURLCache及其任何子类已经提供的缓存功能。只要您的NSURLRequest对象具有正确的缓存策略,并且您的服务器响应包含有效的Cache-Control标头,响应将自动缓存以用于后续请求。

按如下方式设置缓存,您就可以了

- (void)setupCache {
    NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:1024*1024*4 // 1MB mem cache
                                                         diskCapacity:1024*1024*5 // 5MB disk cache
                                                             diskPath:nil];
    [NSURLCache setSharedURLCache:urlCache];
}

然后只是正常执行请求,如果资源在缓存中,您将获得缓存命中,并且您不会下载两次。


请注意,如果您必须支持iOS5以下的任何内容,则必须使用SDURLCache之类的替代网址缓存,并将其设置如下

- (void)setupCache {
    SDURLCache *urlCache = [[SDURLCache alloc] initWithMemoryCapacity:1024*1024   // 1MB mem cache
                                                         diskCapacity:1024*1024*5 // 5MB disk cache
                                                             diskPath:[SDURLCache defaultCachePath]];
    [NSURLCache setSharedURLCache:urlCache];
}

原因在this article中得到了很好的解释,但可以通过以下引用进行总结:

  

在iOS5之前,NSURLCache只是将请求保存到内存中,即使文档另有说明 - diskCapacity属性也被默默忽略