SDWebImage 如何获取内存缓存命中时的图片数据(NSData)?

发布时间:2026/9/13 5:09:34
SDWebImage 如何获取内存缓存命中时的图片数据(NSData)? SDWebImage 如何获取内存缓存命中时的图片数据NSData【免费下载链接】SDWebImageAsynchronous image downloader with cache support as a UIImageView category项目地址: https://gitcode.com/GitHub_Trending/sd/SDWebImage在 SDWebImage 中直接用SDWebImageManager加载图片时如果图片已经命中内存缓存完成回调里的NSData参数默认是空的——项目文档 Docs/HowToUse.md 明确说明When the image is from memory cache, it will not contain anyNSDataby default. 如果你需要拿到这张图片的原始二进制数据例如做转发、二次压缩或写自己的存储就必须显式告诉管理器在查询内存缓存时一并查询 image data。本文给出两条路径面向 URL 的SDWebImageManager加载路径主路径以及直接查询SDImageCache的低层路径。前提理解默认行为与对应的 optionSDWebImageManager的加载完成块是SDInternalCompletionBlock其签名中包含NSData参数定义见 SDWebImageManager.htypedef void(^SDInternalCompletionBlock)(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL);文档说明这个data参数就是 the NSData representation第四个参数SDImageCacheType指示图片来自哪里。但默认情况下图片命中内存缓存时不会查询 image datadata为nil。要改变这个行为使用SDWebImageOptions中的两个 option定义见 SDWebImageDefine.hSDWebImageQueryMemoryData强制在内存缓存命中时同时查询 image data。注意即使加了它这次数据查询默认仍是异步的SDWebImageQueryMemoryDataSync与上一个组合使用改为同步查询内存 image data。文档的注释原话是Query data synchronously is not recommend, unless you want to ensure the image is loaded in the same runloop to avoid flashing during cell reusing.不推荐同步查询除非你希望在同一次 runloop 内确保图片已加载以避免 cell 复用时的闪烁主路径通过 SDWebImageManager 加载并拿到 NSData调用loadImageWithURL:options:context:progress:completed:SDWebImageManager.h把SDWebImageQueryMemoryData放进options。下面示例中imageURL替换为你要加载的图片 URL#import SDWebImage/SDWebImageManager.h [SDWebImageManager.sharedManager loadImageWithURL:imageURL options:SDWebImageQueryMemoryData context:nil progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) { if (cacheType SDImageCacheTypeMemory data ! nil) { // 内存缓存命中且拿到了 NSData } }];几点执行要点该 option 只在图片来自缓存的场景才有意义。图片来自网络下载或磁盘缓存时data本来就有值磁盘命中时同样有NSData加不加SDWebImageQueryMemoryData都不影响拿到数据如果需要在回调返回的瞬间同一次 runloop就能使用data例如给即将复用的 cell 立即取数据就把 option 写成SDWebImageQueryMemoryData | SDWebImageQueryMemoryDataSync。这是文档唯一给出的同步查询理由返回的SDWebImageCombinedOperation可保存起来用于取消加载本文场景下内存命中时回调很快通常用不到。结果验证判断是否内存缓存命中且数据查询成功依据文档给出的回调参数即可回调中cacheType SDImageCacheTypeMemory表示图片来自内存缓存枚举定义见 SDImageCacheDefine.hSDImageCacheTypeMemory对应 the image was obtained from the memory cachedata非nil即为你要的NSData。反向验证默认行为不带任何 option 再加载同一张已进内存缓存的图片cacheType仍是SDImageCacheTypeMemory但data为nil——这正是文档描述的 by default 行为。可选分支直接查询 SDImageCache低层路径如果你的任务本身就是查缓存而不是走完整加载管线可以不经过SDWebImageManager直接调用SDImageCache的查询接口queryCacheOperationForKey:options:done:SDImageCache.h。其完成块类型为SDImageCacheQueryCompletionBlockSDImageCacheDefine.htypedef void(^SDImageCacheQueryCompletionBlock)(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType);对应的 cache 层 option 是SDImageCacheOptions里的SDImageCacheQueryMemoryData和SDImageCacheQueryMemoryDataSyncSDImageCache.h含义与 Manager 层一致默认内存命中不查数据SDImageCacheQueryMemoryData强制同时查 image data异步再加SDImageCacheQueryMemoryDataSync改为同步。#import SDWebImage/SDImageCache.h // key 是图片的缓存 key通常是图片绝对 URL 字符串 // 若由 URL 生成可用 - [SDWebImageManager sharedManager] cacheKeyForURL: [SDImageCache.sharedImageCache queryCacheOperationForKey:key options:SDImageCacheQueryMemoryData done:^(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType) { if (cacheType SDImageCacheTypeMemory data ! nil) { // 内存缓存命中且拿到了 NSData } }];该接口返回SDImageCacheToken遵循SDWebImageOperation可用于取消这次缓存查询查询被取消时done块不会被调用头文件注释Will not get called if the operation is cancelled。文档版本差异一个已移除的旧常量Docs/HowToUse.md 中写的是 you can passSDWebImageQueryDataWhenInMemoryin options arg但仓库的 5.0 API 差异清单 Docs/API-Diff/5.0/apidiff.html 标记了 Removed: SDWebImageQueryDataWhenInMemory当前源码 SDWebImageDefine.h 中对应的 option 是SDWebImageQueryMemoryData。两处文档不一致按 5.0 源码应以SDWebImageQueryMemoryData为准如果你引用的是基于旧文档的第三方示例见到SDWebImageQueryDataWhenInMemory时直接替换即可。限制同步查询SDWebImageQueryMemoryDataSync/SDImageCacheQueryMemoryDataSync文档明确不推荐其适用场景仅限于确保图片在同一次 runloop 内加载完成避免 cell 复用闪烁磁盘缓存写回行为头文件注释说明新版本起磁盘命中不再回写内存缓存In history, when disk cache hit, the image will write back into memory cache ... From new version this behavior is removed不要把这一旧行为作为逻辑前提本文只覆盖内存命中时取NSData。若你要控制的是回调队列如在哪个队列收到data头文件提示通过 context option.callbackQueue传递这里不展开。【免费下载链接】SDWebImageAsynchronous image downloader with cache support as a UIImageView category项目地址: https://gitcode.com/GitHub_Trending/sd/SDWebImage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询