// // YYWebImageManager.m // YYKit // // Created by ibireme on 15/2/19. // Copyright (c) 2015 ibireme. // // This source code is licensed under the MIT-style license found in the // LICENSE file in the root directory of this source tree. // #import "YYWebImageManager.h" #import "YYImageCache.h" #import "YYWebImageOperation.h" #import "YYImageCoder.h" @implementation YYWebImageManager + (instancetype)sharedManager { static YYWebImageManager *manager; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ YYImageCache *cache = [YYImageCache sharedCache]; NSOperationQueue *queue = [NSOperationQueue new]; if ([queue respondsToSelector:@selector(setQualityOfService:)]) { queue.qualityOfService = NSQualityOfServiceBackground; } manager = [[self alloc] initWithCache:cache queue:queue]; }); return manager; } - (instancetype)init { @throw [NSException exceptionWithName:@"YYWebImageManager init error" reason:@"Use the designated initializer to init." userInfo:nil]; return [self initWithCache:nil queue:nil]; } - (instancetype)initWithCache:(YYImageCache *)cache queue:(NSOperationQueue *)queue{ self = [super init]; if (!self) return nil; _cache = cache; _queue = queue; _timeout = 15.0; if (YYImageWebPAvailable()) { _headers = @{ @"Accept" : @"image/webp,image/*;q=0.8" }; } else { _headers = @{ @"Accept" : @"image/*;q=0.8" }; } return self; } - (YYWebImageOperation *)requestImageWithURL:(NSURL *)url options:(YYWebImageOptions)options progress:(YYWebImageProgressBlock)progress transform:(YYWebImageTransformBlock)transform completion:(YYWebImageCompletionBlock)completion { NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.timeoutInterval = _timeout; request.HTTPShouldHandleCookies = (options & YYWebImageOptionHandleCookies) != 0; request.allHTTPHeaderFields = [self headersForURL:url]; request.HTTPShouldUsePipelining = YES; request.cachePolicy = (options & YYWebImageOptionUseNSURLCache) ? NSURLRequestUseProtocolCachePolicy : NSURLRequestReloadIgnoringLocalCacheData; YYWebImageOperation *operation = [[YYWebImageOperation alloc] initWithRequest:request options:options cache:_cache cacheKey:[self cacheKeyForURL:url] progress:progress transform:transform ? transform : _sharedTransformBlock completion:completion]; if (_username && _password) { operation.credential = [NSURLCredential credentialWithUser:_username password:_password persistence:NSURLCredentialPersistenceForSession]; } if (operation) { NSOperationQueue *queue = _queue; if (queue) { [queue addOperation:operation]; } else { [operation start]; } } return operation; } - (NSDictionary *)headersForURL:(NSURL *)url { if (!url) return nil; return _headersFilter ? _headersFilter(url, _headers) : _headers; } - (NSString *)cacheKeyForURL:(NSURL *)url { if (!url) return nil; return _cacheKeyFilter ? _cacheKeyFilter(url) : url.absoluteString; } @end