| /* | |
| * This file is part of the SDWebImage package. | |
| * (c) Olivier Poitrey <rs@dailymotion.com> | |
| * | |
| * For the full copyright and license information, please view the LICENSE | |
| * file that was distributed with this source code. | |
| */ | |
| #import "SDWebImageCompat.h" | |
| #import "SDWebImageOperation.h" | |
| #import "SDWebImageDownloader.h" | |
| #import "SDImageCache.h" | |
| typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { | |
| /** | |
| * By default, when a URL fail to be downloaded, the URL is blacklisted so the library won't keep trying. | |
| * This flag disable this blacklisting. | |
| */ | |
| SDWebImageRetryFailed = 1 << 0, | |
| /** | |
| * By default, image downloads are started during UI interactions, this flags disable this feature, | |
| * leading to delayed download on UIScrollView deceleration for instance. | |
| */ | |
| SDWebImageLowPriority = 1 << 1, | |
| /** | |
| * This flag disables on-disk caching | |
| */ | |
| SDWebImageCacheMemoryOnly = 1 << 2, | |
| /** | |
| * This flag enables progressive download, the image is displayed progressively during download as a browser would do. | |
| * By default, the image is only displayed once completely downloaded. | |
| */ | |
| SDWebImageProgressiveDownload = 1 << 3, | |
| /** | |
| * Even if the image is cached, respect the HTTP response cache control, and refresh the image from remote location if needed. | |
| * The disk caching will be handled by NSURLCache instead of SDWebImage leading to slight performance degradation. | |
| * This option helps deal with images changing behind the same request URL, e.g. Facebook graph api profile pics. | |
| * If a cached image is refreshed, the completion block is called once with the cached image and again with the final image. | |
| * | |
| * Use this flag only if you can't make your URLs static with embeded cache busting parameter. | |
| */ | |
| SDWebImageRefreshCached = 1 << 4, | |
| /** | |
| * In iOS 4+, continue the download of the image if the app goes to background. This is achieved by asking the system for | |
| * extra time in background to let the request finish. If the background task expires the operation will be cancelled. | |
| */ | |
| SDWebImageContinueInBackground = 1 << 5, | |
| /** | |
| * Handles cookies stored in NSHTTPCookieStore by setting | |
| * NSMutableURLRequest.HTTPShouldHandleCookies = YES; | |
| */ | |
| SDWebImageHandleCookies = 1 << 6, | |
| /** | |
| * Enable to allow untrusted SSL ceriticates. | |
| * Useful for testing purposes. Use with caution in production. | |
| */ | |
| SDWebImageAllowInvalidSSLCertificates = 1 << 7, | |
| /** | |
| * By default, image are loaded in the order they were queued. This flag move them to | |
| * the front of the queue and is loaded immediately instead of waiting for the current queue to be loaded (which | |
| * could take a while). | |
| */ | |
| SDWebImageHighPriority = 1 << 8, | |
| /** | |
| * By default, placeholder images are loaded while the image is loading. This flag will delay the loading | |
| * of the placeholder image until after the image has finished loading. | |
| */ | |
| SDWebImageDelayPlaceholder = 1 << 9 | |
| }; | |
| typedef void(^SDWebImageCompletionBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL); | |
| typedef void(^SDWebImageCompletionWithFinishedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL); | |
| typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url); | |
| @class SDWebImageManager; | |
| @protocol SDWebImageManagerDelegate <NSObject> | |
| @optional | |
| /** | |
| * Controls which image should be downloaded when the image is not found in the cache. | |
| * | |
| * @param imageManager The current `SDWebImageManager` | |
| * @param imageURL The url of the image to be downloaded | |
| * | |
| * @return Return NO to prevent the downloading of the image on cache misses. If not implemented, YES is implied. | |
| */ | |
| - (BOOL)imageManager:(SDWebImageManager *)imageManager shouldDownloadImageForURL:(NSURL *)imageURL; | |
| /** | |
| * Allows to transform the image immediately after it has been downloaded and just before to cache it on disk and memory. | |
| * NOTE: This method is called from a global queue in order to not to block the main thread. | |
| * | |
| * @param imageManager The current `SDWebImageManager` | |
| * @param image The image to transform | |
| * @param imageURL The url of the image to transform | |
| * | |
| * @return The transformed image object. | |
| */ | |
| - (UIImage *)imageManager:(SDWebImageManager *)imageManager transformDownloadedImage:(UIImage *)image withURL:(NSURL *)imageURL; | |
| @end | |
| /** | |
| * The SDWebImageManager is the class behind the UIImageView+WebCache category and likes. | |
| * It ties the asynchronous downloader (SDWebImageDownloader) with the image cache store (SDImageCache). | |
| * You can use this class directly to benefit from web image downloading with caching in another context than | |
| * a UIView. | |
| * | |
| * Here is a simple example of how to use SDWebImageManager: | |
| * | |
| * @code | |
| SDWebImageManager *manager = [SDWebImageManager sharedManager]; | |
| [manager downloadWithURL:imageURL | |
| options:0 | |
| progress:nil | |
| completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { | |
| if (image) { | |
| // do something with image | |
| } | |
| }]; | |
| * @endcode | |
| */ | |
| @interface SDWebImageManager : NSObject | |
| @property (weak, nonatomic) id <SDWebImageManagerDelegate> delegate; | |
| @property (strong, nonatomic, readonly) SDImageCache *imageCache; | |
| @property (strong, nonatomic, readonly) SDWebImageDownloader *imageDownloader; | |
| /** | |
| * The cache filter is a block used each time SDWebImageManager need to convert an URL into a cache key. This can | |
| * be used to remove dynamic part of an image URL. | |
| * | |
| * The following example sets a filter in the application delegate that will remove any query-string from the | |
| * URL before to use it as a cache key: | |
| * | |
| * @code | |
| [[SDWebImageManager sharedManager] setCacheKeyFilter:^(NSURL *url) { | |
| url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; | |
| return [url absoluteString]; | |
| }]; | |
| * @endcode | |
| */ | |
| @property (copy) SDWebImageCacheKeyFilterBlock cacheKeyFilter; | |
| /** | |
| * Returns global SDWebImageManager instance. | |
| * | |
| * @return SDWebImageManager shared instance | |
| */ | |
| + (SDWebImageManager *)sharedManager; | |
| /** | |
| * Downloads the image at the given URL if not present in cache or return the cached version otherwise. | |
| * | |
| * @param url The URL to the image | |
| * @param options A mask to specify options to use for this request | |
| * @param progressBlock A block called while image is downloading | |
| * @param completedBlock A block called when operation has been completed. | |
| * | |
| * This parameter is required. | |
| * | |
| * This block has no return value and takes the requested UIImage as first parameter. | |
| * In case of error the image parameter is nil and the second parameter may contain an NSError. | |
| * | |
| * The third parameter is an `SDImageCacheType` enum indicating if the image was retrived from the local cache | |
| * or from the memory cache or from the network. | |
| * | |
| * The last parameter is set to NO when the SDWebImageProgressiveDownload option is used and the image is | |
| * downloading. This block is thus called repetidly with a partial image. When image is fully downloaded, the | |
| * block is called a last time with the full image and the last parameter set to YES. | |
| * | |
| * @return Returns an NSObject conforming to SDWebImageOperation. Should be an instance of SDWebImageDownloaderOperation | |
| */ | |
| - (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url | |
| options:(SDWebImageOptions)options | |
| progress:(SDWebImageDownloaderProgressBlock)progressBlock | |
| completed:(SDWebImageCompletionWithFinishedBlock)completedBlock; | |
| /** | |
| * Saves image to cache for given URL | |
| * | |
| * @param image The image to cache | |
| * @param url The URL to the image | |
| * | |
| */ | |
| - (void)saveImageToCache:(UIImage *)image forURL:(NSURL *)url; | |
| /** | |
| * Cancel all current opreations | |
| */ | |
| - (void)cancelAll; | |
| /** | |
| * Check one or more operations running | |
| */ | |
| - (BOOL)isRunning; | |
| /** | |
| * Check if image has already been cached | |
| * | |
| * @param url image url | |
| * | |
| * @return if the image was already cached | |
| */ | |
| - (BOOL)cachedImageExistsForURL:(NSURL *)url; | |
| /** | |
| * Check if image has already been cached on disk only | |
| * | |
| * @param url image url | |
| * | |
| * @return if the image was already cached (disk only) | |
| */ | |
| - (BOOL)diskImageExistsForURL:(NSURL *)url; | |
| /** | |
| * Async check if image has already been cached | |
| * | |
| * @param url image url | |
| * @param completionBlock the block to be executed when the check is finished | |
| * | |
| * @note the completion block is always executed on the main queue | |
| */ | |
| - (void)cachedImageExistsForURL:(NSURL *)url | |
| completion:(SDWebImageCheckCacheCompletionBlock)completionBlock; | |
| /** | |
| * Async check if image has already been cached on disk only | |
| * | |
| * @param url image url | |
| * @param completionBlock the block to be executed when the check is finished | |
| * | |
| * @note the completion block is always executed on the main queue | |
| */ | |
| - (void)diskImageExistsForURL:(NSURL *)url | |
| completion:(SDWebImageCheckCacheCompletionBlock)completionBlock; | |
| /** | |
| *Return the cache key for a given URL | |
| */ | |
| - (NSString *)cacheKeyForURL:(NSURL *)url; | |
| @end | |
| #pragma mark - Deprecated | |
| typedef void(^SDWebImageCompletedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType) __deprecated_msg("Block type deprecated. Use `SDWebImageCompletionBlock`"); | |
| typedef void(^SDWebImageCompletedWithFinishedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) __deprecated_msg("Block type deprecated. Use `SDWebImageCompletionWithFinishedBlock`"); | |
| @interface SDWebImageManager (Deprecated) | |
| /** | |
| * Downloads the image at the given URL if not present in cache or return the cached version otherwise. | |
| * | |
| * @deprecated This method has been deprecated. Use `downloadImageWithURL:options:progress:completed:` | |
| */ | |
| - (id <SDWebImageOperation>)downloadWithURL:(NSURL *)url | |
| options:(SDWebImageOptions)options | |
| progress:(SDWebImageDownloaderProgressBlock)progressBlock | |
| completed:(SDWebImageCompletedWithFinishedBlock)completedBlock __deprecated_msg("Method deprecated. Use `downloadImageWithURL:options:progress:completed:`"); | |
| @end |