NSURLSession用于网络图片下载+缓存

2023-12-21

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

然而它是好简单使用简单的 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. 这些框架中的缓存更具确定性。这NSURLCache被使用过NSURLSession(a) 有点不透明(例如,我从未见过记录的 5% 阈值); (b) 由服务器提供的响应标头控制。

  2. 在你简单地声明之前NSURLCache“足够好”,我建议严格测试应用程序并确保缓存(特别是持久存储缓存:运行应用程序,下载图像;终止(不仅仅是挂起)应用程序;重新运行应用程序)按照您希望的方式工作这是。确保测试运行时缓存和持久存储缓存。

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

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

    • The UIImageViewAFNetworking 和 SDWebImage 提供的类别是实现异步图像检索的最简单方法。特别是,当在表/集合视图中重用单元格时,它将取消之前的请求,确保优先考虑可见单元格的图像请求。 (您不想快速滚动到表中的第 100 行,并且必须等待 99 个不长期可见的图像下载,然后才能开始下载可见单元格的图像。)

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSURLSession用于网络图片下载+缓存 的相关文章

随机推荐

  • 我应该在 Redux App 中哪里处理排序?

    我有一个动作 减速器 组件 在我的一个组件 组件转储 中 我有一个选择 我获得有关我的商店的过滤器类型的信息 我可以在action或reducer中在哪里处理它 IMO 对数据进行排序的正确位置不是直接在减速器中 而是在选择器 来自 red
  • 识别 C/C++ 中未使用的函数 [重复]

    这个问题在这里已经有答案了 可能的重复 在大型 C 遗留应用程序中查找 死代码 https stackoverflow com questions 2380153 finding dead code in a large c legacy
  • wpf 组合框 selectedIndex=0 不起作用

    xaml
  • 什么时候可以将结构安全地散列为字节数组?

    对于相等意味着每个数据成员的相同的最派生类型和字节相等的结构 何时 如果有 可以将该结构安全地散列为字节数组 这个文件 http www open std org jtc1 sc22 wg21 docs papers 2012 n3333
  • 诗歌配置无效 - 不允许附加属性(“组”是意外的)

    最近 我在诗歌方面遇到了这个问题 我所有使用诗歌的命令都失败并出现以下错误 RuntimeError The Poetry configuration is invalid Additional properties are not all
  • 如何从 torrent 跟踪器响应中获取对等列表

    我正在制作一个种子客户端 我解码 torrent 文件并将此请求发送到跟踪器 http tracker mininova org announce uploaded 0 downloaded 0 compact 0 event starte
  • 为什么函数式语言如此大量地使用列表?

    我的意思是 列表相对于其他数据结构有哪些优势 使其在函数式语言中几乎不可避免 没有勺子 如果我告诉你没有字符串这样的东西怎么办 仅存在单个字符的列表 那么如果我告诉你不存在列表这样的东西呢 仅存在对 construct a pair of
  • Visual Studio Code 无法在 WSL 2 上运行/工作

    不知怎的 当我跑步时code 在 WSL 内部 它根本不执行任何操作 如果我which code它确实返回了 Windows 上的 VS Code 路径 但仍然没有任何反应 经过一番研究 真正解决我问题的是 在 WSL 终端中 运行rm r
  • 用于返回合格子节点值的字符串串联的 XPath

    任何人都可以建议一种 XPath 表达式格式 该格式返回一个字符串值 其中包含元素的某些合格子节点的串联值 但忽略其他值 div This text node should be returned em And the value of t
  • UIGestureRecognizer 导致循环保留?

    我在想 如果你将目标指定为self在手势识别器中initWithTarget action 方法 会引起循环retain吗 自从self将保留识别器self gestureRecognizers并且手势识别器也有可能将自身保留在initWi
  • 在类方法中使用 self

    我在 ShareKit 中遇到了这段代码 我不明白作者的想法 使用self在类方法中 有警告 不兼容的指针类型将 Class 发送到参数类型id
  • 用户在权限屏幕上单击“允许”后启动活动

    我的一项活动需要位置许可 我编写了下面的代码来获得许可 但在这种情况下 如果应用程序最初没有位置权限 则用户需要单击两次才能打开活动 我可以进行一些更改 以便一旦用户在 权限 屏幕上单击 允许 只有然后意图才会触发 int PERMISSI
  • 我无法将信息从表单输入到数据库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 询问代码的问题必须对所解决的问题表现出最低限度的了解 包括尝试的解决方案 为什么它们不起作用以及预期结果 也可以看看 Stack Over
  • 如何检查 keras 训练是否已经在 GPU 中运行?

    有时我会犯一个错误 尝试在同一个 GPU 两个不同的脚本 中使用 keras 同时运行两个训练 导致我的机器崩溃或破坏两个训练 我希望能够在我的脚本中测试是否有一些训练正在运行 因此可以更改 GPU 或停止新的训练 我发现寻找答案的唯一提示
  • 无法在 vba IE 中应用正则表达式

    我使用vba结合IE编写了一个脚本来解析应用程序网页中的联系信息regex在上面 我进行了很多搜索 但找不到任何可以满足我的要求的示例 这pattern可能并不理想地找到phone号 但这里主要关心的是我如何使用pattern在 vba I
  • 在 C# 中解析原始 Protocol Buffer 字节流

    给定一个协议缓冲区编码Stream or byte 但不知道对象类型本身 我们如何打印消息的骨架 该用例用于调试基于 protobuf 的 IO 以进行根本原因分析 如果有现有的工具可以从二进制文件中解析原始 Protocol Buffer
  • 如何滚动到英国底部?

    我使用 PhoneGap 开发了一款应用程序 在我的应用程序中 我使用在列表视图中显示了许多元素ui li 这里我想滚动到列表中的最后一个元素 为此 我使用了以下代码 dates li last addClass active li foc
  • ScriptManager.RegisterClientScriptIninclude 在 UpdatePanel 中不起作用

    我已浏览网络 但尚未找到以下问题的解决方案 我有这个示例页面 ScriptManager aspx ScriptManager an UpdatePanel a MultiView有两个Views和两个LinkButtons两个视图之间切换
  • 如何在build.gradle中指定Android应用程序支持的架构?

    我的Android应用程序仅支持arm64 v8a和armeabi v7a 但是 由于依赖项之一 我在 apk 的 lib 文件夹中看到以下内容 arm64 v8a armeabi armeabi v7a mips x86 x86 64 这
  • NSURLSession用于网络图片下载+缓存

    有许多第三方库用于加载网络图像 然后将其存储到磁盘和 或内存中 然而它是好简单使用简单的 NSURLSession API 调用来实现它 这是代码 NSURLCache myCache NSURLCache alloc initWithMe