1. 在初始化过程中+[SDWebImageManager sharedManager]
,然后执行-[init]
,然后首先读取defaultXXX
,如果为null
,然后再配置自己的类。
+ (id <SDImageCache>)defaultImageCache {
return _defaultImageCache;
}
+ (void )setDefaultImageCache:(id <SDImageCache>)defaultImageCache {
if (defaultImageCache && ![defaultImageCache conformsToProtocol: @protocol (SDImageCache)]) {
return ;
}
_defaultImageCache = defaultImageCache;
}
+ (id <SDImageLoader>)defaultImageLoader {
return _defaultImageLoader;
}
+ (void )setDefaultImageLoader:(id <SDImageLoader>)defaultImageLoader {
if (defaultImageLoader && ![defaultImageLoader conformsToProtocol: @protocol (SDImageLoader)]) {
return ;
}
_defaultImageLoader = defaultImageLoader;
}
+ (nonnull instancetype )sharedManager {
static dispatch_once_t once;
static id instance;
dispatch_once (&once, ^{
instance = [self new ];
});
return instance;
}
- (nonnull instancetype )init {
// / 读取默认值,没有的话再设置[SDImageCache sharedImageCache]
id <SDImageCache> cache = [[self class ] defaultImageCache ];
if (!cache) {
cache = [SDImageCache sharedImageCache ];
}
// / 读取默认值,没有的话再设置[SDWebImageDownloader sharedDownloader]
id <SDImageLoader> loader = [[self class ] defaultImageLoader ];
if (!loader) {
loader = [SDWebImageDownloader sharedDownloader ];
}
return [self initWithCache: cache loader: loader];
}
- (nonnull instancetype )initWithCache:(nonnull id <SDImageCache>)cache loader:(nonnull id <SDImageLoader>)loader {
if ((self = [super init ])) {
_imageCache = cache;
_imageLoader = loader;
_failedURLs = [NSMutableSet new ];
SD_LOCK_INIT (_failedURLsLock);
_runningOperations = [NSMutableSet new ];
SD_LOCK_INIT (_runningOperationsLock);
}
return self;
}
#if SD_USE_OS_UNFAIR_LOCK
#define SD_LOCK (lock ) os_unfair_lock_lock(&lock)
#else
#define SD_LOCK (lock ) if (@available(iOS 10 , tvOS 10 , watchOS 3 , macOS 10.12 , *)) os_unfair_lock_lock(&lock); \
else OSSpinLockLock(&lock##_deprecated);
#endif
#define dispatch_main_async_safe (block )\
if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(dispatch_get_main_queue())) {\
block ();\
} else {\ dispatch_async (dispatch_get_main_queue (), block);\
}
#endif