本文主要介绍如何在使用 SDWebImage 时通过集成 CIDownloader 网络库进行网络优化。
CIDownloader 网络库接管图片加载网络层,并新增了如下功能:
1. 在网络层新增了 HTTPDNS,有效避免由于运营商传统 LocalDNS 解析导致的无法访问最佳接入点的方案。原理为使用 HTTP 加密协议替代传统的 DNS 协议,整个过程不使用域名,大大减少劫持的可能性。
2. 在网络层接入 QUIC,提升弱网加载图片成功率,增强用户体验。
3. SDK 内部增加了重试机制,并支持自定义重试次数以及重试间隔时间,用于降低因为网络波动造成图片加载失败的风险。
4. 自定义加载图片并发数。
说明:
SDK 版本需要大于等于 v1.5.0。
安装 SDWebImage 和 CIDownloader 库
podfile 文件中添加:
pod 'CloudInfinite/CIDownloader' // 自定义网络层 + SDWebImage
导入头文件
#import "CIDNSLoader.h"#import "CIImageDownloader.h"#import "SDWebImage-CloudInfinite.h"#import "QCloudQuicConfig.h"
配置 CIImageDownloader
指定哪些场景使用 CIImageDownloader 进行下载解码图片。
// return YES; 表示用 CIImageDownloader ,// return NO; 表示不用 CIImageDownloader ,用 SDWebImage 默认下载器。// 默认只有 TPG、AVIF 图片使用 CIImageDownloader。[CIImageDownloader sharedDownloader].canUseCIImageDownloader = ^BOOL(NSURL * _Nonnull url, SDWebImageOptions options, SDWebImageContext * _Nonnull context) {return YES;};
配置 HTTPDNS
1. 接入 HTTPDNS,首先需要在 Podfile 文件中添加 HTTPDNS 库依赖。
pod 'CloudInfinite/CIDNS' // DNS 模块,内部已封装腾讯 HTTPDNS
2. 设置 HTTPDNS 参数
DnsConfig config;config.appId = @"appId";config.dnsIp = @"1.1.1.1";config.dnsId = 000000;config.dnsKey = @"dnsKey"; // des 的密钥config.encryptType = HttpDnsEncryptTypeDES;config.debug = YES;config.timeout = 5000;self.dnsloader = [[CIDNSLoader alloc] initWithConfig:config];[QCloudHttpDNS shareDNS].delegate = self.dnsloader;
配置重试
SDK 内部已默认重试3次间隔1s。
[CIImageDownloader sharedDownloader].retryCount = 2;[CIImageDownloader sharedDownloader].sleepTime = 2;// 可选配置,SDK 内部已有默认筛选[CIImageDownloader sharedDownloader].canUseRetryWhenError = ^BOOL(QCloudURLSessionTaskData * _Nonnull task, NSError * _Nonnull error) {// 指定哪些错误需要重试return YES;};
配置 QUIC
说明:
1. 接入 QUIC,首先需要在 Podfile 文件中添加 QUIC 库依赖。
pod 'CloudInfinite/Quic' // QUIC 模块
2. 开启 QUIC。
[CIImageDownloader sharedDownloader].enableQuic = YES;// 配置 QUIC 白名单,指定哪些 host 可用 QUIC ,不指定并开启 则表示全部使用 QUIC[CIImageDownloader sharedDownloader].quicWhiteList = @[@"examples-1251000004.cos.ap-shanghai.myqcloud.com"];[QCloudQuicConfig shareConfig].race_type = QCloudRaceTypeQUICHTTP;
配置并发量
customConcurrentCount 当前并发数量。maxConcurrentCount SDK 内会根据当前网络状态冬天调整并发数量,最小1,最大 maxConcurrentCount。
// 可选配置,SDK 内默认并发3,最大并发6。[CIImageDownloader sharedDownloader].customConcurrentCount = 5;[CIImageDownloader sharedDownloader].maxConcurrentCount = 10;