有许多第三方库用于加载网络映像,然后将其存储到磁盘和/或内存中。
然而,使用简单的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?
答案 0 :(得分:1)
在这些框架中缓存更具确定性。 NSURLCache
使用的NSURLSession
是(a)有些不透明(例如,我从未见过记录的5%阈值); (b)由您的服务器提供的响应标头控制。
在您简单声明NSURLCache
"足够好"之前,我建议严格测试应用并确保缓存(特别是持久性存储缓存:运行应用,下载图像;终止(不仅仅是暂停)应用程序;重新运行应用程序)正如您希望的那样工作。确保测试运行时缓存以及持久存储缓存。
顺便说一下,你的内存缓存似乎很小(超过5%的缓存大小的任何东西都不会被缓存)。这是一个意见问题,但我通常希望看到接近16mb而不是16kb的东西。实际上,这不会超过800字节左右的任何缓存!
这些框架也提供了许多其他优势。
AFNetworking和SDWebImage提供的UIImageView
类别是实现异步图像检索的最简单方法。特别是,当在表/集合视图中重用单元格时,它将取消先前的请求,确保对可见单元格的图像请求进行优先级排序。 (您不想快速滚动到表格中的第100行,在开始下载可见单元格的图像之前,必须等待99个不久的可见图像下载。)
如果生成复杂的HTTP请求,AFNetworking可让您专注于应用程序逻辑,而不是编写和测试复杂的网络代码。
过去,依靠iOS中的NSURLCache一直存在问题,特别是如果你不控制服务器。这些类也提供了其他优点(例如,使用UIImageView类别)。
答案 1 :(得分:0)
NSURLCache是一个很棒的工具,特别是当您需要重新验证机制时,NSURLCache会为您透明地处理HTTP重新验证。对于Cocoa网络来说,NSURLSession也是一个很好的step forward。
然而,以有效的方式实现图像提取并不容易。您可能在app中有一些特殊要求:
gif
或webp
。并以其他方式扩展图像获取。还有更多。
AFNetworking,FastImageCache,SDWebImage,SDImageCache
这些框架都没有使用NSURLSession(有些甚至有自己的磁盘缓存实现),请查看Nuke / DFImageManager。它建立在NSURLSession的基础之上,它具有上述所有功能,并且还有多个子规格,可以将AFNetworking *作为网络堆栈集成,FLAnimatedImage作为动画GIF引擎等等。
* AFNetworking基于NSRULSession,但它们的图像获取实现仍然基于NSURLConnection(AFHTTPRequestOperation)。