AFNetworking 2.0 上的缓存
Posted
技术标签:
【中文标题】AFNetworking 2.0 上的缓存【英文标题】:Caching on AFNetworking 2.0 【发布时间】:2013-11-11 11:59:23 【问题描述】:所以这就是交易。我最近开始使用 AFNetworking 在开始时使用以下代码下载一些文件:
NSMutableURLRequest* rq = [api requestWithMethod:@"GET" path:@"YOUR/URL/TO/FILE" parameters:nil];
AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:rq] autorelease];
NSString* path=[@"/PATH/TO/APP" stringByAppendingPathComponent: imageNameToDisk];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"SUCCCESSFULL IMG RETRIEVE to %@!",path)
failure:^(AFHTTPRequestOperation *operation, NSError *error)
// Deal with failure
];
我的路径实际上插入了路径变量(对不起,现在不在正确的计算机上实际复制意大利面文本,但它与上面的完全相同,但路径不同)
一切都很好!我正在成功下载文件和所有内容。我目前的问题是我试图让缓存工作,但我遇到了很多困难。基本上,我不确定从 AFNetworking 2.0 开始我实际上需要在客户端做什么。我还需要设置 NSURlCache 吗?我是否需要在请求操作上设置不同的缓存类型标头?我认为它可能只是 完全 内置的,但每次代码运行时我都会收到 200 的状态,即使文件没有更改。如果我必须使用 NSUrlCache,我是否必须自己手动保存成功块请求操作上的电子标签,然后再将其反馈回来?任何有关如何取得进展的帮助将不胜感激。谢谢大家!
【问题讨论】:
默认 url 请求的 cachePolicy 应该可以正常工作——你确定服务器允许缓存吗? 尝试为您的请求操作明确设置缓存策略 所以,如果我对你们的理解正确,它应该缓存我上面输入的 0 额外内容,是吗?显然我应该在成功阻止操作时得到 304 是吗? @AlexSullivan 我认为缓存的对象是在成功块中返回的,所以你不会看到 304,你会看到缓存的原始请求返回的 200。 304 在 HTTP 世界中被认为是“成功”,但我在失败块中得到了 304。 【参考方案1】:AFNetworking 默认使用 NSURLCache 进行缓存。来自the FAQ:
AFNetworking 利用
NSURLCache
及其任何子类已经提供的缓存功能。只要您的NSURLRequest
对象具有正确的缓存策略,并且您的服务器响应包含有效的Cache-Control
标头,响应就会自动缓存以供后续请求使用。
请注意,此机制缓存NSData
,因此每次从此缓存中检索时,您都需要执行一个有点昂贵的NSData
-to-UIImage
操作。这对于快速显示来说性能不够,例如,如果您在 UITableView
或 UICollectionView
中显示图像。
如果是这种情况,请查看UIImageView+AFNetworking
,它将UIImage
对象的下载和缓存添加到UIImageView
。对于某些应用程序,您可以只使用开箱即用的实现,但它是非常基本的。您可能想查看这个类的源代码(它不是很长)并将其用作您自己的缓存机制的起点。
【讨论】:
另外:SDWebImage 是一个更强大的图像下载、缓存和显示库,但它没有与 AFNetworking 集成:github.com/rs/SDWebImage以上是关于AFNetworking 2.0 上的缓存的主要内容,如果未能解决你的问题,请参考以下文章
缓存图像,使其不会在 reloadData 调用时重新加载 - AFNetworking 2.0 setImageWithUrl
AFNetworking 2.0 请求挂在 iOS 9 / WatchOS 2 中的 Today Extension 和 Watch 应用程序中