SDWebImage 使用指南:从基础到高级应用
一、SDWebImage 简介
SDWebImage 是一个强大的 iOS 图像加载和缓存库,它提供了简单易用的 API 来异步下载和缓存网络图片。这个库特别适合在 UITableView 或 UICollectionView 中加载大量图片的场景,能显著提升应用的性能和用户体验。
二、基础用法:在 UITableView 中使用
2.1 基本图片加载
在 UITableView 的 cellForRowAtIndexPath 方法中加载图片非常简单:
#import <SDWebImage/UIImageView+WebCache.h>
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://example.com/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
return cell;
}
import SDWebImage
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyIdentifier", for: indexPath)
cell.imageView?.sd_setImage(with: imageUrl, placeholderImage: placeholderImage)
return cell
}
2.2 工作原理
当调用 sd_setImageWithURL 方法时,SDWebImage 会:
- 首先检查内存缓存中是否有该图片
- 如果没有,检查磁盘缓存
- 如果缓存中都没有,才会发起网络请求下载图片
- 下载完成后会自动缓存图片并显示在 UIImageView 上
三、进阶用法:使用回调块
3.1 完成回调
[cell.imageView sd_setImageWithURL:imageURL
placeholderImage:placeholderImage
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (error) {
NSLog(@"图片加载失败: %@", error);
} else {
NSLog(@"图片来自 %@", cacheType == SDImageCacheTypeMemory ? @"内存缓存" :
cacheType == SDImageCacheTypeDisk ? @"磁盘缓存" : @"网络下载");
}
}];
3.2 进度回调
[cell.imageView sd_setImageWithURL:imageURL
placeholderImage:placeholderImage
options:0
progress:^(NSInteger receivedSize, NSInteger expectedSize) {
CGFloat progress = (CGFloat)receivedSize / expectedSize;
NSLog(@"下载进度: %.2f%%", progress * 100);
}
completed:nil];
四、高级用法:直接使用 SDWebImageManager
SDWebImageManager 是核心管理类,它协调了下载器和缓存系统:
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager loadImageWithURL:imageURL
options:SDWebImageRetryFailed
progress:nil
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
if (image) {
// 使用图片
}
}];
常用选项(options)包括:
- SDWebImageRetryFailed:失败后自动重试
- SDWebImageLowPriority:在滚动时降低下载优先级
- SDWebImageCacheMemoryOnly:只缓存到内存
- SDWebImageProgressiveLoad:渐进式加载
五、独立使用下载器和缓存系统
5.1 独立使用下载器
SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
[downloader downloadImageWithURL:imageURL
options:0
progress:nil
completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
if (image && finished) {
// 使用下载的图片
}
}];
5.2 独立使用缓存系统
// 查询缓存
[[SDImageCache sharedImageCache] queryDiskCacheForKey:cacheKey
done:^(UIImage *image, SDImageCacheType cacheType) {
if (image) {
// 使用缓存的图片
}
}];
// 存储图片
[[SDImageCache sharedImageCache] storeImage:image
forKey:cacheKey
completion:nil];
六、自定义缓存策略
6.1 自定义缓存键
SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
// 移除URL中的查询参数
NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
components.query = nil;
return [components.URL absoluteString];
};
6.2 自定义缓存命名空间
// 创建独立的缓存实例
SDImageCache *customCache = [[SDImageCache alloc] initWithNamespace:@"custom"];
七、最佳实践建议
-
合理设置占位图:使用与目标图片尺寸相近的占位图,避免布局跳动
-
处理单元格重用:在复杂列表中,考虑在 prepareForReuse 中取消图片加载
- (void)prepareForReuse { [self.imageView sd_cancelCurrentImageLoad]; [super prepareForReuse]; } -
内存管理:在内存警告时清理缓存
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { [[SDImageCache sharedImageCache] clearMemory]; } -
磁盘缓存清理:定期清理过期缓存
[[SDImageCache sharedImageCache] cleanDiskWithCompletionBlock:nil]; -
图片预处理:可以使用 SDWebImage 的 transformer 功能对下载的图片进行预处理(如圆角、压缩等)
通过合理使用 SDWebImage 的各种功能,可以显著提升应用中图片加载的性能和用户体验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



