【发布时间】:2018-02-21 23:46:28
【问题描述】:
有许多第三方库用于加载网络映像,然后将其存储到磁盘和/或内存中。
但是使用简单的 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等其他第三方框架有什么优势?
【问题讨论】:
-
NSURLSession中的缓存取决于 (a) 相对于缓存大小的下载大小; (b) 响应的标头。我真的会对你的应用程序进行压力测试,并确保缓存(尤其是持久存储缓存)像你想象的那样工作。您的内存缓存似乎非常小(任何超过缓存大小 5% 的内容都不会被缓存)。最重要的是,过去在 iOS 中依赖NSURLCache一直存在问题,尤其是在您不控制服务器的情况下。这些类也提供其他优势(例如,UIImageView类别)。 -
谢谢罗伯。我已经根据您的评论编辑了我的问题。关于内存缓存大小,仅作为使用示例,没有实际的工作编号。关于 iOS 中的 NSURLCache 问题,我记得这些问题,但我相信它们在 iOS8 及更高版本中不再相关。最后,假设服务器定义了缓存行为,还有更多的优势吗?
-
好的。我通常希望内存缓存以 MB 为单位,而不是 KB。 :) 通过
NSURLCache重新缓存成功,我只建议先凭经验验证这一点。但是,如果NSURLSession满足您的需求,那么请继续使用它。我会退后一步考虑一下应用程序更广泛的网络需求,但如果您不需要复杂的 HTTP 请求创建/处理,也不需要UIImageView类别等,那么请坚持使用NSURLSession。
标签: ios afnetworking sdwebimage