SDWebImage 官方文档 翻译(v3.7.5 中文 简介,非API文档 )

2023-11-10

最近正在自学iOS,看到网上有项目用SDWebImage,便找来文档看看,顺便记录一下,也方便大家阅读(官方文档地址: http://cocoadocs.org/docsets/SDWebImage/3.7.5/ 以下是翻译内容)。
Web Image
SDWebImage提供了一个UIImageView的分类来支持获取远程图片。这个库提供了如下功能:
1. 提供UIImageView的一个分类用以支持对Cocoa Touch framework添加网络图片以及管理、缓存图片。
2. 支持异步图片下载
3. 支持内存+硬盘级的图片缓存,并且自动处理缓存过期情况
4. 支持GIF
5. 支持WebP 格式
6. 支持后台解码图片
7. 保证同一个URL的图片不会被多次重复下载
8. 保证不会多次尝试访问一个失效或者错误的URL
9. 保证主线程不会被卡住
10. 性能优秀
11. 使用GCD和ARC
12. 支持Arm64
注意:3.0版本的SDWebImage不能完全兼容2.0版本,并且3.0版本需要iOS版本5.1.1以上。如果你需要在iOS 5.0以下版本开发,请使用2.0版本的SDWebImage

在UITableview中使用UIImageView+WebCache分类
只需要导入UIImageView+WebCache.h头文件,然后在tableView:cellForRowAtIndexPath: 中调用sd_setImageWithURL:placeholder:方法,SDWebImage将会帮你处理下载和缓存的所有工作。

import <SDWebImage/UIImageView+WebCache.h>

...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *MyIdentifier = @"MyIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:MyIdentifier] autorelease];
    }

    // Here we use the new provided sd_setImageWithURL: method to load the web image
    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                      placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

    cell.textLabel.text = @"My Text";
    return cell;
}

使用Blocks
你可以使用blocks来通知你的程序图片下载进度以及图片下载完成与否。这里我们使用sd_setImageWithURL:方法来加载网络图片

[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                      placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                             completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                                ... completion code here ...
                             }];

注意,如果在图片下载完成之前取消了图片下载,success或者failure block不会被调用

使用SDWebImageManager
SDWebImageManager是在UIImageView+WebCache分类背后实现很多功能的类,这个类会异步下载图片到缓存中。你可以直接使用这个类来缓存图片,而不用在UIView类中调用(照我的理解就是不用在初始化UI的时候下载图片,而是后台直接先把图片下载下来供以后使用)。下面举个栗子:

SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadImageWithURL:imageURL
                      options:0
                     progress:^(NSInteger receivedSize, NSInteger expectedSize) {
                         // progression tracking code
                     }
                     completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
                         if (image) {
                             // do something with image
                         }
                     }];

单独使用异步图片下载器
单独调用异步图片下载器也是可以的,请看代码:

SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
[downloader downloadImageWithURL:imageURL
                         options:0
                        progress:^(NSInteger receivedSize, NSInteger expectedSize) {
                            // progression tracking code
                        }
                       completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
                            if (image && finished) {
                                // do something with image
                            }
                        }];

单独使用异步图片缓存
单独调用基于异步操作的图片缓存也是可以的。SDImageCache 类中维护着一个内存缓存和一个可选的硬盘缓存(也就是内存和外存)。硬盘缓存的写操作是异步的,不会对UI刷新增加不必要的延迟。
SDImageCache类提供一个单例,但是如果你想创建一个与默认实例不同名字空间的缓存,你也可以创建自己的实例。
你可以调用 queryDiskCacheForKey:done: 方法从缓存中寻找图片。如果该方法返回nil,说明要寻找的图片并没有缓存下来,那么你有必要自己调用方法来缓存它。缓存标识key是全局唯一的,通常来说默认是图片的绝对URL。

SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"];
[imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) {
    // image is not nil if image was found
}];

默认情况下,SDImageCache将会先在memory缓存中寻找图片,如果没找到,会去disk缓存中寻找。如果你只想在memory缓存中寻找,可以调用imageFromMemoryCacheForKey:方法。

要将图片添加到缓存里,你可以调用 storeImage:forKey: 方法

[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];

默认情况下,图片会同时被缓存到memory和disk缓存中(当然是异步的哈)。如果你只想缓存到memeory中,调用storeImage:forKey:toDisk: (原文为:use the alternative method storeImage:forKey:toDisk: with a negative third argument,是说第三个参数就填个无效的值?)

使用缓存key过滤器
有时候可能你不想用图片的URL作为缓存的key,因为有时候URL是动态的。SDWebImageManager提供一个方法来设置一个缓存key过滤器,这个过滤器接收NSURL作为输入,然后生成一个NSString的缓存key。
下面的栗子是在APPDelegate中设置了一个过滤器,这个过滤器会去除掉URL中的查询字符串(query-string,也就是URL问好后面的那段),然后将其作为缓存key

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
        url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path];
        return [url absoluteString];
    };

    // Your app init code...
    return YES;
}

常见问题
在UITableViewCell中使用动态图片尺寸
UITableView中的图片尺寸被cell中的第一个image set所决定。如果你的网络图片大小与placeholder图片的不一致,下面的链接可能帮到你:
http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/ (这个网站打不开啊。。)

处理图片刷新
SDWebImage默认情况下缓存图片非常快。它不鸟所有HTTP服务器返回来的缓存控制头,直接缓存图片。这暗示着图片的URLs是静态的,不会改变。如果URL指向的图片改变了,URL也应该跟着改变。
如果你不能控制图片服务器,当图片发生变化时,可能你就不能修改图片的URL。这种情况就像Facebook的avatar URLs。这种情况下,你可以使用SDWebImageRefresheCached标识。这会稍微减缓缓存性能,从而遵循HTTP返回的HTTP caching control headers

[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
                 placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
                          options:SDWebImageRefreshCached];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SDWebImage 官方文档 翻译(v3.7.5 中文 简介,非API文档 ) 的相关文章

  • UITableView 滑动删除 iOS 上的手势冲突

    我的手势识别器有问题 我的目标是在表视图中实现使用滑动删除 但我认为其他手势是相互冲突的 我正在使用这个库romonthego REFrostedViewController https github com romaonthego REF
  • XCode 4.5 给我“SenTestingKit/SenTestKit.h”文件未找到,但适用于 4.4.1

    我刚刚安装了 XCode 4 5 它在我现有的项目之一上给了我一个 SenTestingKit SenTestingKit h 文件未找到错误 此错误仅发生在 XCode 4 5 中 但它在 4 4 1 上编译正常 我已经检查过SenTes
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • ios 导航 堆栈操作

    我在尝试从 iOS 应用程序操作导航堆栈时遇到问题 或者至少是由于这种操纵而产生的行为 我的情况 我有 3 个 ViewController 控制器a显示多个级别 控制器 b 是游戏视图 控制器 c 是某种分数 显然 我将在控制器 a 中选
  • iOS 上的 UIBezierPath 操作

    我从一条直线开始 我希望用户能够触摸并拖动该线 使其弯曲 实际上 他们有能力将线条操纵成波浪形状 我不确定从技术上实现这一目标的最简单方法 我首先创建了三次曲线的 UIBezierPaths 数组 目的是操纵控制点 但似乎一旦绘制了 UIB
  • 为什么在授予用户权限时,UIUserNotificationType.None 在当前设置中返回 true?

    我正在编写一种方法来检查当前用户设置是否包含某些通知类型 当检查当前设置是否包含 UIUserNotificationsType None 时 无论授予权限还是拒绝权限 它都会返回 true 有谁知道这是为什么吗 func register
  • 适用于 IOS 和 Android 的支付网关 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个应用程序 用户必须在澳大利亚餐馆通过应用程序 android ios 付款 有两种付款方式 通过 PayPal 或 Visa
  • 从 iOS 应用程序内的 Junos Pulse 获取用户凭据

    我正在通过 Junos Pulse 在 iPad 中建立 VPN 连接 以进入我组织的 Intranet 谁能告诉我是否有任何 iOS api 或 SDK 可用于获取在 iOS 应用程序内的 Junos pulse 中输入的用户凭据 Jun
  • 为什么我不能在 Realm 属性上使用 private

    我正在尝试在 RealmSwift 中存储一个枚举案例 但 Realm 不支持枚举 本文 https medium com it works locally persisting swift enumerations with realm
  • iPhone UINavigationBar 使用 [UINavigationBar 外观] 更改所有控制器的字体样式

    我知道我可以单独更改导航栏的字体 如本答案所述 更改导航栏的字体 https stackoverflow com questions 5832036 change the navigation bars font 目前我正在使用一种更全局的
  • 如何解决 CoreData mogenerator 未找到问题

    我收到如下所示的错误 我不知道我错过了什么 我该如何解决这个问题 如下图所示 Users nischalhada Documents XcodePro mnepalnews revisited 2 0 CoreData mogenerato
  • iOS 中的构建对象文件扩展名是什么?

    当我在项目中构建java对象类时 将创建带有 class扩展名的构建文件 并且人类不可读 快速构建文件怎么样 example car java gt build gt car class 构建后会是什么 car swift gt build
  • 进入前台后刷新数据

    更改默认设置后 我想在AppDelegate中进入前台时刷新myViewController的数据 我所做的是 AppDelegate m void applicationDidFinishLaunching UIApplication a
  • iOS:提高图像绘制速度

    我有一系列想要制作动画的图像 UIImageView支持一些基本的动画 但不足以满足我的需求 我的第一个方法是使用UIImageView并设置image当图像属性 这太慢了 速度慢的原因是图像的绘制 这让我感到惊讶 我以为瓶颈会加载图像 我
  • Xcode 中的 iOS 9 警告 - 此文件设置为针对早于项目部署的版本进行构建。功能可能有限

    我刚刚将我的 Mac 更新到最新的操作系统 并将 Xcode 更新到最新版本 现在我收到此警告 但我不知道该由谁来删除它 也不知道它的真正含义是什么 有人可以向我解释一下吗 Thanks Select Main storyboard in
  • 个人帐户开发者之间的 Apple 开发/分发证书

    我一直在到处寻找有关处理证书的正确答案 想象一下以下帐户 Joe拥有个人 Apple 帐户 但他根本不会编码 他只是发布了该应用程序并将其称为自己的 Bob还有一个个人 Apple 帐户 Bob 是一位编码专家 Joe 付费让他开发他的第一
  • SiriKit 错误:此应用程序不支持捐赠意图

    我在 Xcode 10 iOS 12 Beta 中捐赠自定义意图时遇到问题 我创建了一个在我的主应用程序目标和 OrderIntent 目标之间共享的自定义框架 我创建了一个 intentdefinition 文件 并将目标成员资格设置为我
  • 在 UIImage 顶部绘制透明圆圈 - iPhone SDK

    我在尝试找出如何在 UIImageView 中的 UIImage 顶部绘制透明圆圈时遇到了很多麻烦 谷歌给了我线索 但我仍然找不到有效的例子 有没有人知道的例子可以证明这一点 最简单的方法就是创建一个半透明的方形 UIView 然后将其图层
  • 如何反转 CGPath 的点顺序

    我想画一个圆圈 并用它打出字母 为此 我需要顺时针抚摸圆圈 逆时针抚摸字母 这一切都很好 但是当我使用 Core Text 获取字母路径时 我不知道如何从本质上反转该路径 不是镜像或旋转或任何东西 这很简单 我希望点笔画顺序是逆时针的 这实
  • Swift C 回调 - Swift 类指针的 takeUnretainedValue 或 takeRetainedValue

    我有一些UIView or UITableViewCell 里面我有 C 回调 例如 CCallback bridge self observer data gt Void in let mySelf Unmanaged

随机推荐

  • Android开发必须掌握!Kotlin可能带来的一个深坑,使用指南

    1 项目介绍 Flutter是目前比较流行的跨平台开发技术 凭借其出色的性能获得很多前端技术爱好者的关注 比如阿里闲鱼 美团 腾讯等大公司都有投入相关案例生产使用 基于Flutter Dart chewie photo view image
  • 聊一聊 Java 中的 ThreadLocal

    前言 本文首发于我的个人博客 http yifanstar top 提到 ThreadLocal Java 开发者并不陌生 在面试中 也经常被面试官提及 对 Java 开发者而言也是一个必须掌握的知识点 所以将它理解透彻是很有必要的 文章稍
  • linux下lpython查版本信息,ln进行python软连接、find、which进行环境变量文件查找、ps进行进程查看、/usr/local/为软件安装主目录-new

    1 查看某个安装包的版本信息指令 python m django version 如果是查看其它安装包的信息则改为其它包名即可 2 ln进行python版本软连接 安装python3 5推荐使用Anaconda 推荐安装到 usr loca
  • 推荐9个最顶级的IT公众号

    固步自封只会让自己落后于他人 如今 网络已将人与人之间的距离拉近 我们应开拓自己的眼界 结识更多的大能来丰富自己的知识 以下是8个技术公众号 每日共享最新的技术资讯 快收下这波安利吧 stormzhang stormzhang 大家都喊他张
  • Python pip install 安装包报错ERROR: Could not find a version that satisfies the requirement XXX解决方法

    Python pip install 安装包报错ERROR Could not find a version that satisfies the requirement XXX解决方法 文章目录 Python pip install 安装
  • 利用arp欺骗获取局域网目标浏览的图片

    之前的实验中实现了arp断网攻击 这是arp欺骗错误配置下产生的现象 所谓arp欺骗 就是在断网攻击的前提下 让流量转发出去 原理 使目标主机认为攻击者的网卡是网关 从而将数据包都发给攻击者的网卡 攻击者的网卡再开启转发 将数据包传到真正网
  • 毕业设计 单片机选题100例(五)

    单片机毕业设计项目分享系列 这里是DD学长 单片机毕业设计及享100例系列的第一篇 目的是分享高质量的毕设作品给大家 包含全面内容 源码 原理图 PCB 实物演示 论文 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的单片机项目缺少
  • 数据结构之优先级队列(堆)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 二叉树的顺序存储 1 存储方式 2 下标关系 二 堆 概念 创建大根堆 三 堆的应用及相关操作 入队列 出队列 得到队头元素 四 Java中的优先级队列 细节问
  • Shell编程:函数的简单应用

    Shell编程是一种在Unix或类Unix系统上进行脚本编程的方法 脚本是一系列命令的集合 用于自动化执行特定任务 在Shell脚本中 函数是一种组织和重用代码的重要方式 函数允许将一段代码片段封装起来 并在需要时进行调用 本文将介绍She
  • MySQL参数sql-mode配置

    一 问题描述 采用Navicat连接mysql 在执行SQL时报错 Err 1055 Expression 1 of ORDER BY clause is not in GROUP BY clause and contains nonagg
  • 贡献30本经典Linux学习和开发教程和资料,都是pdf完整版的

    贡献30本经典Linux学习和开发教程和资料 都是pdf完整版的 字号 订阅 完全免费下载 无需注册也无需积分 pdf版经典Linux学习教程资料列表 电子书 下载链接 单个资源下载 101 深入理解Linux内核 第三版 英文版 1030
  • pandas(一):read_csv解决第一列Unnamed问题

    先直接给答案 configdata pd read csv savepath encoding utf 8 index col 0 然后我们展开来说明 首先下面这个图片是原始csv数据 1 第一列问题 上述图片可以看到 因为csv文件自带第
  • 面试经典(22)---字符串组合

    题目 输入一个字符串 输出该字符串中字符的所有组合 举个例子 如果输入abc 它的组合有a b c ab ac bc abc 假设我们想在长度为n的字符串中求m个字符的组合 我们先从头扫描字符串的第一个字符 针对第一个字符 我们有两种选择
  • RenderCore模块抄写记录(ue5.2)

    共151个文件 47800行 截至2023年9月10日 剩余个文件 行
  • 冒泡排序、插入排序、选择排序的时间、空间复杂度以及优化方案

    文章目录 冒泡排序 插入排序 选择排序 冒泡排序 冒泡排序 Bubble Sort 是一种计算机科学领域的较简单的排序算法 需求 4 5 6 3 2 1 排序后 1 2 3 4 5 6 排序原理 比较相邻的元素 如果前一个元素比后一个元素大
  • Lock wait timeout exceeded解决方案

    Err 1205 Lock wait timeout exceeded try restarting transaction 基本原因 后提交的事务等待前面处理的事务释放锁 但是在等待的时候超过了mysql的锁等待时间 就会引发这个异常 1
  • 用latex写IEEE论文投稿的踩坑笔记

    目录 预备 安装TeXstudio 一 下载IEEE的LaTeX模板 二 修改引文方式 1 更新IEEEtran bst文件 2 新建一个 txt文件 把bib格式的引文信息全都复制进去 方法如下 保存后把文件后缀名改为 bib 3 改一下
  • NUC980开源项目15-编译默认配置uboot

    上面是我的微信和QQ群 欢迎新朋友的加入 项目码云地址 国内下载速度快 https gitee com jun626 nuc980 open source project 项目github地址 https github com Jun117
  • 初始数据结构(c语言版本)

    目录 基本概念和专业术语 数据结构概念 数据结构的结构类型 1 逻辑结构 1 集合结构 2 线性结构 3 树结构 4 图结构或网状结构 2 存储结构 1 顺序储存结构 2 链式储存结构 数据类型和抽象数据类型 抽象数据类型的表示与实现 算法
  • SDWebImage 官方文档 翻译(v3.7.5 中文 简介,非API文档 )

    最近正在自学iOS 看到网上有项目用SDWebImage 便找来文档看看 顺便记录一下 也方便大家阅读 官方文档地址 http cocoadocs org docsets SDWebImage 3 7 5 以下是翻译内容 Web Image