gpt4 book ai didi

ios - 网络图片下载+缓存的NSURLSession

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:14:29 24 4
gpt4 key购买 nike

有许多第三方库可用于加载网络图像,然后将其存储到磁盘和/或内存中。

但是,使用简单的 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 有什么优势?

最佳答案

  1. 这些框架中的缓存更具确定性。 NSURLSession 使用的 NSURLCache (a) 有点不透明(例如,我从未见过记录的 5% 阈值); (b) 由您的服务器提供的响应 header 控制。

  2. 在简单地声明 NSURLCache“足够好”之前,我建议严格测试应用程序并确保缓存(尤其是持久存储缓存:运行应用程序,下载图像;终止(不仅仅是暂停)应用程序;重新运行应用程序)就像你希望的那样工作。确保同时测试运行时缓存和持久存储缓存。

  3. 顺便说一句,您的内存缓存似乎真的很小(任何超过缓存大小 5% 的内容都不会被缓存)。这是一个见仁见智的问题,但我通常希望看到更接近 16mb 而不是 16kb 的东西。事实上,这不会缓存任何超过 800 字节左右的内容!

  4. 这些框架还提供了许多其他优势。

    • AFNetworking 和SDWebImage 提供的UIImageView 类是实现异步图像检索最简单的方法。特别是,当单元格在表/ Collection View 中重复使用时,它将取消先前的请求,确保优先处理可见单元格的图像请求。 (您不希望快速滚动到表中的第 100 行,并且在开始下载可见单元格的图像之前必须等待 99 个长期不可见的图像下载。)

    • 如果生成复杂的 HTTP 请求,AFNetworking 可让您专注于应用逻辑,而不是编写和测试复杂的网络代码。

归根结底,过去在 iOS 中依赖 NSURLCache 一直存在问题,尤其是在您不控制服务器的情况下。这些类也提供了其他优势(例如 UIImageView 类别)。

关于ios - 网络图片下载+缓存的NSURLSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31368831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com