CNLiveWebImageManager.m 4.66 KB
//
//  CNLiveWebImageManager.m
//  WSWebImageDemo
//
//  Created by 王帅 on 16/7/27.
//  Copyright © 2016年 王帅. All rights reserved.
//

#import "CNLiveWebImageManager.h"
#import "CNLiveWebImageDownload.h"
#import "CNLiveImageCache.h"

@interface CNLiveWebImageManager ()

@property (nonatomic, strong) CNLiveImageCache *imageCache;
@property (nonatomic, strong) NSMutableSet *failedURLs;

@end

@implementation CNLiveWebImageManager

+ (id)sharedManager
{
    static id manager;
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        manager = [self new];
    });
    return manager;
}

- (instancetype)init
{
    if ((self = [super init])) {
        _imageCache = [CNLiveImageCache sharedImageCache];
        _failedURLs = [NSMutableSet new];
    }
    return self;
}

- (id<CNLiveWebImageOperation>)downloadWebImageWithURL:(NSURL *)url options:(CNLiveWebImageOptions)options progress:(CNLiveDownloadProgressBlock)progress completed:(CNLiveDownloadCompletedBlock)completed
{
    if ([url isKindOfClass:NSString.class]) {
        url = [NSURL URLWithString:(NSString *)url];
    }
    if (![url isKindOfClass:NSURL.class]) {
        url = nil;
    }
    
    BOOL isFailedUrl = NO;
    @synchronized (self.failedURLs) {
        isFailedUrl = [self.failedURLs containsObject:url];
    }
    if (!url || (!(options & CNLiveWebImageRetryFailed) && isFailedUrl)) {
        NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil];
        completed(nil, nil, error, YES);
    }
    
    BOOL hasCacheImage = [self.imageCache queryDiskCacheForKey:url.absoluteString done:^(UIImage *image, CNLiveImageCacheType type) {
        if (image) {
            completed(image,UIImageJPEGRepresentation(image, 1.0), nil, YES);
        }
    }];;
    
    if (hasCacheImage) {
        return nil;
    }
    
    
    CNLiveWebImageDownloadOptions downloadOptions = 0;
    if (options & CNLiveWebImageProgressiveDownload) downloadOptions |= CNLiveWebImageDownloadProgressiveDownload;
    if (options & CNLiveWebImageContinueInBackground) downloadOptions |= CNLiveWebImageDownloadContinueInBackground;
    id <CNLiveWebImageOperation> operation = [[CNLiveWebImageDownload sharedDownload] downloadWebImageWithURL:url options:downloadOptions progress:progress completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
        if (error) {
            BOOL shouldBeFailedURLAlliOSVersion = (error.code != NSURLErrorNotConnectedToInternet && error.code != NSURLErrorCancelled && error.code != NSURLErrorTimedOut);
            BOOL shouldBeFailedURLiOS7 = (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1 && error.code != NSURLErrorInternationalRoamingOff && error.code != NSURLErrorCallIsActive && error.code != NSURLErrorDataNotAllowed);
            if (shouldBeFailedURLAlliOSVersion || shouldBeFailedURLiOS7) {
                @synchronized (self.failedURLs) {
                    [self.failedURLs addObject:url];
                }
            }
        }
        else {
            if ((options & CNLiveWebImageRetryFailed)) {
                @synchronized (self.failedURLs) {
                    [self.failedURLs removeObject:url];
                }
            }
            
            BOOL cacheOnDisk = !(options & CNLiveWebImageCacheMemoryOnly);
            if (image && finished) {
                if (cacheOnDisk) {
                    [self.imageCache storeImage:image forKey:[url absoluteString] toDisk:YES];
                }
                else {
                    [self.imageCache storeImage:image forKey:[url absoluteString] toDisk:NO];
                }
            }
            
            completed(image, data, error, finished);
        }
        
    }];
    return operation;
}

- (void)storeImage:(UIImage *)image imageUrl:(NSURL *)url toDisk:(BOOL)toDisk
{
    [self.imageCache storeImage:image forKey:url.absoluteString toDisk:toDisk];
}

- (UIImage *)imageFromMemoryCacheWithImageUrl:(NSURL *)url
{
    return [self.imageCache imageFromMemoryCacheForKey:url.absoluteString];
}

- (UIImage *)imageFromDiskCacheWithImageUrl:(NSURL *)url
{
    return [self.imageCache imageFromDiskCacheForKey:url.absoluteString];
}

- (BOOL)queryDiskCacheWithImageUrl:(NSURL *)url done:(CNLiveWebImageQueryCompletedBlock)doneBlock
{
    return [self.imageCache queryDiskCacheForKey:url.absoluteString done:doneBlock];
}

- (void)removeCacheWithUrl:(NSURL *)url done:(CNLiveCompletedBlock)completed
{
    [self.imageCache removeCacheForKey:url.absoluteString done:completed];
}

- (long long)diskCacheSize
{
    return [self.imageCache diskCacheSize];
}

- (void)clearMemory
{
    [self.imageCache clearMemory];
}

- (void)clearDisk
{
    [self.imageCache clearDisk];
}

@end