您的位置:首页 > 其它

AFNetworking 图片的本地缓存问题

2015-07-10 12:47 429 查看
原帖:http://blog.csdn.net/andy_jiangbin/article/details/17009157

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 *)dirName
101 {
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 *)imageType
117 {
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         else
133         {
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 *)imageName
141 {
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     else
156     {
157         return NULL;
158     }
159 }



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: