You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
4.6 KiB
159 lines
4.6 KiB
// |
|
// DCWebImageManager.m |
|
// DCWebPicScrollView |
|
// |
|
// Created by dengchen on 15/12/7. |
|
// Copyright © 2015年 name. All rights reserved. |
|
// |
|
|
|
#import "DCWebImageManager.h" |
|
|
|
@interface DCWebImageManager () |
|
|
|
@property (nonatomic,copy) NSString *cachePath; |
|
|
|
@property (nonatomic,strong) NSMutableDictionary *DownloadImageCount; |
|
|
|
@end |
|
|
|
@implementation DCWebImageManager |
|
|
|
+ (instancetype)shareManager { |
|
|
|
static DCWebImageManager *instance; |
|
|
|
static dispatch_once_t onceToken; |
|
dispatch_once(&onceToken, ^{ |
|
instance = [[DCWebImageManager alloc] init]; |
|
}); |
|
|
|
return instance; |
|
} |
|
|
|
#pragma mark downLoadImage |
|
|
|
- (BOOL)LoadDiskCacheWithUrlString:(NSString *)urlSting { |
|
//取沙盒缓存 |
|
NSData *data = [NSData dataWithContentsOfFile:[self.cachePath stringByAppendingPathComponent:urlSting.lastPathComponent]]; |
|
|
|
if (data.length > 0 ) { |
|
|
|
UIImage *image = [UIImage imageWithData:data]; |
|
|
|
if (image) { |
|
[self.webImageData setObject:image forKey:urlSting]; |
|
return YES; |
|
}else { |
|
[[NSFileManager defaultManager] removeItemAtPath:[self.cachePath stringByAppendingPathComponent:urlSting.lastPathComponent] error:NULL]; |
|
} |
|
} |
|
return NO; |
|
} |
|
|
|
|
|
- (void)downloadImageWithUrlString:(NSString *)urlSting { |
|
|
|
if ([self LoadDiskCacheWithUrlString:urlSting]) { |
|
return; |
|
} |
|
|
|
if ([UIDevice currentDevice].systemVersion.floatValue >= 7.0) { |
|
|
|
[[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:urlSting] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { |
|
|
|
[self downLoadImagefinish:data |
|
url:urlSting |
|
error:error |
|
response:response]; |
|
|
|
}] resume]; |
|
|
|
}else { |
|
|
|
[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlSting]] |
|
queue:[[NSOperationQueue alloc] init] |
|
completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { |
|
|
|
[self downLoadImagefinish:data |
|
url:urlSting |
|
error:connectionError |
|
response:response]; |
|
}] ; |
|
|
|
} |
|
} |
|
|
|
|
|
|
|
- (void)downLoadImagefinish:(NSData *)data url:(NSString *)urlString error:(NSError *)error response:(NSURLResponse *)response{ |
|
|
|
if (error) { |
|
[self repeatDownLoadImage:urlString error:error]; |
|
return ; |
|
} |
|
|
|
UIImage *image = [UIImage imageWithData:data]; |
|
|
|
|
|
if (!image) { |
|
|
|
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response; |
|
NSString *errorData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; |
|
|
|
NSError *error = [NSError errorWithDomain:[NSString stringWithFormat:@"错误数据字符串信息:%@\nhttp statusCode(错误代码):%zd",errorData,res.statusCode] code:0 userInfo:nil]; |
|
|
|
[self repeatDownLoadImage:urlString error:error]; |
|
return ; |
|
} |
|
|
|
// 内存缓存 |
|
[self.webImageData setObject:image forKey:urlString]; |
|
// 沙盒缓存 |
|
[data writeToFile:[self.cachePath stringByAppendingPathComponent:urlString.lastPathComponent] atomically:YES]; |
|
|
|
|
|
} |
|
|
|
- (void)repeatDownLoadImage:(NSString *)urlString error:(NSError *)error{ |
|
|
|
NSNumber *num = [self.DownloadImageCount objectForKey:urlString]; |
|
NSInteger count = num ? [num integerValue] : 0; |
|
|
|
if (self.DownloadImageRepeatCount > count ) { |
|
|
|
[self.DownloadImageCount setObject:@(++count) forKey:urlString]; |
|
[self downloadImageWithUrlString:urlString]; |
|
|
|
}else { |
|
|
|
if (self.downLoadImageError) { |
|
self.downLoadImageError(error,urlString); |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
#pragma mark lazyload |
|
|
|
- (NSMutableDictionary *)webImageData { |
|
if (!_webImageCache) { |
|
_webImageCache = [[NSMutableDictionary alloc] init]; |
|
} |
|
return _webImageCache; |
|
} |
|
|
|
- (NSMutableDictionary *)DownloadImageCount { |
|
if (!_DownloadImageCount) { |
|
_DownloadImageCount = [NSMutableDictionary dictionary]; |
|
} |
|
return _DownloadImageCount; |
|
} |
|
|
|
- (NSString *)cachePath { |
|
if (!_cachePath) { |
|
_cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; |
|
} |
|
return _cachePath; |
|
} |
|
@end
|
|
|