[imgBtn sd_setImageWithURL:[NSURL URLWithString:item[@"url"]] forState:UIControlStateNormal];
死磕 sd_setImageWithURL方法
核心方法是
- (id <SDWebImageOperation>)loadImageWithURL:(nullable NSURL *)url
options:(SDWebImageOptions)options
progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock
completed:(nullable SDInternalCompletionBlock)completedBlock
核心的类:SDWebImageCombinedOperation&&SDWebImageManager
@interface SDWebImageCombinedOperation : NSObject <SDWebImageOperation>
@property (assign, nonatomic, getter = isCancelled) BOOL cancelled;
@property (strong, nonatomic, nullable) SDWebImageDownloadToken *downloadToken;
@property (strong, nonatomic, nullable) NSOperation *cacheOperation;
@property (weak, nonatomic, nullable) SDWebImageManager *manager;
@end
以及
@interface SDWebImageManager ()
@property (strong, nonatomic, readwrite, nonnull) SDImageCache *imageCache;
@property (strong, nonatomic, readwrite, nonnull) SDWebImageDownloader *imageDownloader;
@property (strong, nonatomic, nonnull) NSMutableSet<NSURL *> *failedURLs;
@property (strong, nonatomic, nonnull) dispatch_semaphore_t failedURLsLock; // a lock to keep the access to `failedURLs` thread-safe
@property (strong, nonatomic, nonnull) NSMutableSet<SDWebImageCombinedOperation *> *runningOperations;
@property (strong, nonatomic, nonnull) dispatch_semaphore_t runningOperationsLock; // a lock to keep the access to `runningOperations` thread-safe
@end
信号量dispatch_semaphore_t 确保线程安全
001 判断URL是否空
002 创建SDWebImageCombinedOperation *operation
003 通过信号量加解锁将URL添加到失败failedURLs数组中
004 通过信号量加解锁将operation添加到runningOperations集合中
005 获取到当前检查当前URL的对应的key
006 设置缓存策略
007 调用SDImageCache 的queryCacheOperationForKey:options:done方法进行从内存和磁盘中查询图片数据
008 在SDImageCache 的queryCacheOperationForKey:options:done回调block中进行如下操作
1.如果这个operation 为空或者被取消了那就安全移除该操作
2.判断是否需要下载那就执行下载,下载失败就会将URL添加到失败数组中,调用代理方法@selector(imageManager:shouldBlockFailedURL:withError:)
下载成功会将URL从失败数组中移除,判断是否存放到磁盘中
3.block回掉返回completionBlock(image, data, error, cacheType, finished, url);