AFNetworking 图片的本地缓存问题
来源:互联网 发布:淘宝蓝钻是什么意思 编辑:程序博客网 时间:2024/05/21 03:25
ASI好久没更新,于是今天试了下AFNetWorking,调用图片请求方法很方便
[self.imageViewsetImageWithURL:[NSURLURLWithString:@"http://best50.cn:8080/update/10/food/72.jpg"] placeholderImage:[UIImageimageNamed:@"placeholder.png"]];
但发现个问题,程序重新启动后,图片还要重新请求,原来AFN用的是内存缓存图片机制,这能提高程序效率,但我们有时候,图片的本地缓存也是很重要的,于是,对AFN下UIImageView+AFNetworking.m文件的代码进行了修改,欢迎大家进行指正,修改和添加的方法如下:
1 - (void)setImageWithURLRequest:(NSURLRequest *)urlRequest 2 placeholderImage:(UIImage *)placeholderImage 3 success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success 4 failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure 5 { 6 [self cancelImageRequestOperation]; 7 8 9 UIImage *cachedImage = [[[self class] af_sharedImageCache] cachedImageForRequest:urlRequest]; 10 if (cachedImage) { 11 12 self.image = cachedImage; 13 self.af_imageRequestOperation = nil; 14 15 if (success) { 16 success(nil, nil, cachedImage); 17 } 18 } else { 19 NSString *urlString = [[urlRequest URL] absoluteString]; 20 NSData *data = [self loadImageData:[self pathInCacheDirectory:@"WendaleCache"] imageName:[urlString md5]]; 21 if (data) { 22 self.image = [UIImage imageWithData:data]; 23 self.af_imageRequestOperation = nil; 24 25 if (success) { 26 success(nil, nil, self.image); 27 } 28 return; 29 } 30 31 self.image = placeholderImage; 32 33 AFImageRequestOperation *requestOperation = [[AFImageRequestOperation alloc] initWithRequest:urlRequest]; 34 [requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 35 if ([[urlRequest URL] isEqual:[[self.af_imageRequestOperation request] URL]]) { 36 if (success) { 37 success(operation.request, operation.response, responseObject); 38 }else if (responseObject) {
39 self.image = responseObject;}
40 //图片本地缓存 41 if ([self createDirInCache:@"WendaleCache"]) { 42 NSString *imageType = @"jpg"; 43 //从url中获取图片类型 44 NSMutableArray *arr = (NSMutableArray *)[urlString componentsSeparatedByString:@"."]; 45 if (arr) { 46 imageType = [arr objectAtIndex:arr.count-1]; 47 } 48 [self saveImageToCacheDir:[self pathInCacheDirectory:@"WendaleCache"] image: responseObject imageName:[urlString md5] imageType:imageType]; 49 } 50 51 52 53 54 self.af_imageRequestOperation = nil; 55 } 56 57 [[[self class] af_sharedImageCache] cacheImage:responseObject forRequest:urlRequest]; 58 59 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 60 if ([[urlRequest URL] isEqual:[[self.af_imageRequestOperation request] URL]]) { 61 if (failure) { 62 failure(operation.request, operation.response, error); 63 } 64 65 self.af_imageRequestOperation = nil; 66 } 67 }]; 68 69 self.af_imageRequestOperation = requestOperation; 70 71 [[[self class] af_sharedImageRequestOperationQueue] addOperation:self.af_imageRequestOperation]; 72 } 73 } 74 75 -(NSString* )pathInCacheDirectory:(NSString *)fileName 76 { 77 NSArray *cachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 78 NSString *cachePath = [cachePaths objectAtIndex:0]; 79 return [cachePath stringByAppendingPathComponent:fileName]; 80 } 81 //创建缓存文件夹 82 -(BOOL) createDirInCache:(NSString *)dirName 83 { 84 NSString *imageDir = [self pathInCacheDirectory:dirName]; 85 BOOL isDir = NO; 86 NSFileManager *fileManager = [NSFileManager defaultManager]; 87 BOOL existed = [fileManager fileExistsAtPath:imageDir isDirectory:&isDir]; 88 BOOL isCreated = NO; 89 if ( !(isDir == YES && existed == YES) ) 90 { 91 isCreated = [fileManager createDirectoryAtPath:imageDir withIntermediateDirectories:YES attributes:nil error:nil]; 92 } 93 if (existed) { 94 isCreated = YES; 95 } 96 return isCreated; 97 } 98 99 // 删除图片缓存100 - (BOOL) deleteDirInCache:(NSString *)dirName101 {102 NSString *imageDir = [self pathInCacheDirectory:dirName];103 BOOL isDir = NO;104 NSFileManager *fileManager = [NSFileManager defaultManager];105 BOOL existed = [fileManager fileExistsAtPath:imageDir isDirectory:&isDir];106 bool isDeleted = false;107 if ( isDir == YES && existed == YES )108 {109 isDeleted = [fileManager removeItemAtPath:imageDir error:nil];110 }111 112 return isDeleted;113 }114 115 // 图片本地缓存116 - (BOOL) saveImageToCacheDir:(NSString *)directoryPath image:(UIImage *)image imageName:(NSString *)imageName imageType:(NSString *)imageType117 {118 BOOL isDir = NO;119 NSFileManager *fileManager = [NSFileManager defaultManager];120 BOOL existed = [fileManager fileExistsAtPath:directoryPath isDirectory:&isDir];121 bool isSaved = false;122 if ( isDir == YES && existed == YES )123 {124 if ([[imageType lowercaseString] isEqualToString:@"png"])125 {126 isSaved = [UIImagePNGRepresentation(image) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]] options:NSAtomicWrite error:nil];127 }128 else if ([[imageType lowercaseString] isEqualToString:@"jpg"] || [[imageType lowercaseString] isEqualToString:@"jpeg"])129 {130 isSaved = [UIImageJPEGRepresentation(image, 1.0) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]] options:NSAtomicWrite error:nil];131 }132 else133 {134 NSLog(@"Image Save Failed\nExtension: (%@) is not recognized, use (PNG/JPG)", imageType);135 }136 }137 return isSaved;138 }139 // 获取缓存图片140 -(NSData*) loadImageData:(NSString *)directoryPath imageName:( NSString *)imageName141 {142 BOOL isDir = NO;143 NSFileManager *fileManager = [NSFileManager defaultManager];144 BOOL dirExisted = [fileManager fileExistsAtPath:directoryPath isDirectory:&isDir];145 if ( isDir == YES && dirExisted == YES )146 {147 NSString *imagePath = [directoryPath stringByAppendingString : imageName];148 BOOL fileExisted = [fileManager fileExistsAtPath:imagePath];149 if (!fileExisted) {150 return NULL;151 }152 NSData *imageData = [NSData dataWithContentsOfFile : imagePath];153 return imageData;154 }155 else156 {157 return NULL;158 }159 }
- AFNetworking 图片的本地缓存问题
- AFNetworking 图片的本地缓存问题
- AFNetworking 图片的本地缓存问题
- AFNetworking 图片的本地缓存问题
- AFNetworking图片缓存问题
- AFNetworking图片缓存问题
- AFNetworking图片缓存问题<转>
- AFNetworking图片缓存问题 -- @ShinePug
- « AFNetworking 图片的本地缓存问题 Get application bundle seed ID in iOS » AFNetworking 使用总结 (用法+JSON解析)
- 关于ImageLoader加载本地缓存下来的图片的问题?
- AFNetworking 配合NSURLCache 本地缓存
- iOS疯狂详解之AFNetworking图片缓存问题
- AFN图片的本地缓存
- 使用AFNetworking上传图片遇到的问题
- 图片的异步加载和本地缓存
- ImageLoader获取本地缓存图片的bitmap
- AFNetworking网络请求时注意的cookies缓存问题
- Android图片本地缓存
- MySQLのchar和varchar
- C# 中的委托和事件
- 数据持久化
- git pull 丢失的文件
- C#,将IrisSkin2皮肤完全整合到exe中
- AFNetworking 图片的本地缓存问题
- 线程锁和EnterCriticalSection、LeaveCriticalSection用法
- QT--QSocketNotifier类介绍
- 使用nginx搭建https服务器
- tomcat下设置jvm内存参数
- cocos2dx-按钮操作
- table_open_cache太大引发的问题
- Android Camera API 1.0, 2.0, 3.0 知多少
- Conflict Misses in Direct-Mapped Caches