有许多第三方库用于加载网络图像,然后将其存储到磁盘和/或内存中。
然而它是好简单使用简单的 NSURLSession API 调用来实现它。
这是代码:
NSURLCache *myCache = [[NSURLCache alloc] initWithMemoryCapacity: 16384 diskCapacity: 268435456 diskPath: cachePath]; // these numbers are only for the usage example.
defaultConfigObject.URLCache = myCache;
defaultConfigObject.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
_session = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];
_dataTask = [_session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
if (!error){
UIImage* theImage = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
self.image = theImage;
});
}
}];
[_dataTask resume];
此代码下载图像(从给定的 url)并根据 http 缓存策略将其存储到内存+磁盘。
从 UIImageView 派生 MyNetworkImageView 并将上述代码添加到 setURL: 方法中也很简单。
我的问题是:
使用AFNetworking、FastImageCache、SDWebImage、SDImageCache等其他第三方框架有什么优势?
这些框架中的缓存更具确定性。这NSURLCache
被使用过NSURLSession
(a) 有点不透明(例如,我从未见过记录的 5% 阈值); (b) 由服务器提供的响应标头控制。
在你简单地声明之前NSURLCache
“足够好”,我建议严格测试应用程序并确保缓存(特别是持久存储缓存:运行应用程序,下载图像;终止(不仅仅是挂起)应用程序;重新运行应用程序)按照您希望的方式工作这是。确保测试运行时缓存和持久存储缓存。
顺便说一句,你的内存缓存似乎非常小(任何超过缓存大小 5% 的内容都不会被缓存)。这是一个见仁见智的问题,但我通常希望看到接近 16mb 而不是 16kb 的东西。事实上,这不会缓存任何超过 800 字节左右的内容!
-
这些框架还提供许多其他优点。
The UIImageView
AFNetworking 和 SDWebImage 提供的类别是实现异步图像检索的最简单方法。特别是,当在表/集合视图中重用单元格时,它将取消之前的请求,确保优先考虑可见单元格的图像请求。 (您不想快速滚动到表中的第 100 行,并且必须等待 99 个不长期可见的图像下载,然后才能开始下载可见单元格的图像。)
如果生成复杂的 HTTP 请求,AFNetworking 可让您专注于应用程序逻辑,而不是编写和测试复杂的网络代码。
底线是,过去在 iOS 中依赖 NSURLCache 一直存在问题,尤其是在您不控制服务器的情况下。这些类还提供其他优点(例如 UIImageView 类别)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)