1

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

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

但我也为接下来的几个单元下载文件。

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

有没有办法阻止它下载两次? 无论如何知道该文件已经被下载了吗?

我正在使用 AFNetworking。

4

1 回答 1

4

你想要做的事情有一个名字,它是缓存

AFNetworking已经按照官方常见问题解答

AFNetworking 有内置的缓存机制吗?

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

如下设置缓存就OK了

- (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,则必须使用替代 URL 缓存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];
}

原因在这篇文章中有很好的解释,但可以通过以下引用来概括:

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

于 2013-08-27T09:19:15.117 回答