AFNetWorking 的简单使用

摘要:
转:http://blog.csdn.net/marujunyy/article/details/18424711由于ASIHTTPRequest不再更新了,不能使用block感觉不太好用;最后选择了AFNetWorking,并做了进一步的封装。需要导入的framework:CFNetwork、Security、SystemConfiguration、MobileCoreServicesGitHu

转:http://blog.csdn.net/marujunyy/article/details/18424711

由于ASIHTTPRequest 不再更新了,不能使用block感觉不太好用;最后选择了AFNetWorking,并做了进一步的封装。

需要导入的framework:CFNetworkSecuritySystemConfigurationMobileCoreServices

GitHub:https://github.com/AFNetworking/AFNetworking

最新的版本为2.0支持iOS 6.0以上系统,在iOS 5上可能报错:Property with 'retain (or strong)' attribute must be of object type

下面是封装的类:

// HttpManager.h

  1. //
  2. //HttpManager.h
  3. //HLMagic
  4. //
  5. //Createdbymarujunon14-1-17.
  6. //Copyright(c)2014年jizhi.Allrightsreserved.
  7. //
  8. #import<Foundation/Foundation.h>
  9. #import<CommonCrypto/CommonDigest.h>
  10. #import"AFNetworking.h"
  11. #import"Reachability.h"
  12. @interfaceNSString(HttpManager)
  13. -(NSString*)md5;
  14. -(NSString*)encode;
  15. -(NSString*)decode;
  16. -(NSString*)object;
  17. @end
  18. @interfaceNSObject(HttpManager)
  19. -(NSString*)json;
  20. @end
  21. @interfaceHttpManager:NSObject
  22. +(HttpManager*)defaultManager;
  23. /*-------判断当前的网络类型----------
  24. 1、NotReachable-没有网络连接
  25. 2、ReachableViaWWAN-移动网络(2G、3G)
  26. 3、ReachableViaWiFi-WIFI网络
  27. */
  28. +(NetworkStatus)networkStatus;
  29. //GET请求
  30. -(void)getRequestToUrl:(NSString*)urlparams:(NSDictionary*)paramscomplete:(void(^)(BOOLsuccessed,NSDictionary*result))complete;
  31. -(void)getCacheToUrl:(NSString*)urlparams:(NSDictionary*)paramscomplete:(void(^)(BOOLsuccessed,NSDictionary*result))complete;//请求失败时使用缓存数据
  32. //POST请求
  33. -(void)postRequestToUrl:(NSString*)urlparams:(NSDictionary*)paramscomplete:(void(^)(BOOLsuccessed,NSDictionary*result))complete;
  34. /*
  35. files:需要上传的文件数组,数组里为多个字典
  36. 字典里的key:
  37. 1、name:文件名称(如:demo.jpg)
  38. 2、file:文件(支持四种数据类型:NSData、UIImage、NSURL、NSString)NSURL、NSString为文件路径
  39. 3、type:文件类型(默认:image/jpeg)
  40. 示例:@[@{@"file":_headImg.currentBackgroundImage,@"name":@"head.jpg"}];
  41. */
  42. //AFHTTPRequestOperation可以暂停、重新开启、取消[operationpause]、[operationresume];、[operationcancel];
  43. -(AFHTTPRequestOperation*)uploadToUrl:(NSString*)url
  44. params:(NSDictionary*)params
  45. files:(NSArray*)files
  46. complete:(void(^)(BOOLsuccessed,NSDictionary*result))complete;
  47. //可以查看进度process_block
  48. -(AFHTTPRequestOperation*)uploadToUrl:(NSString*)url
  49. params:(NSDictionary*)params
  50. files:(NSArray*)files
  51. process:(void(^)(NSIntegerwritedBytes,NSIntegertotalBytes))process
  52. complete:(void(^)(BOOLsuccessed,NSDictionary*result))complete;
  53. /*
  54. filePath:下载文件的存储路径
  55. response:接口返回的不是文件而是json数据
  56. process:进度
  57. */
  58. -(AFHTTPRequestOperation*)downloadFromUrl:(NSString*)url
  59. filePath:(NSString*)filePath
  60. complete:(void(^)(BOOLsuccessed,NSDictionary*response))complete;
  61. -(AFHTTPRequestOperation*)downloadFromUrl:(NSString*)url
  62. params:(NSDictionary*)params
  63. filePath:(NSString*)filePath
  64. process:(void(^)(NSIntegerreadBytes,NSIntegertotalBytes))process
  65. complete:(void(^)(BOOLsuccessed,NSDictionary*response))complete;
  66. @end

//"HttpManager.m"

  1. //
  2. //HttpManager.m
  3. //HLMagic
  4. //
  5. //Createdbymarujunon14-1-17.
  6. //Copyright(c)2014年jizhi.Allrightsreserved.
  7. //
  8. #import"HttpManager.h"
  9. @implementationNSString(HttpManager)
  10. -(NSString*)md5
  11. {
  12. if(self==nil||[selflength]==0){
  13. returnnil;
  14. }
  15. constchar*value=[selfUTF8String];
  16. unsignedcharoutputBuffer[CC_MD5_DIGEST_LENGTH];
  17. CC_MD5(value,(CC_LONG)strlen(value),outputBuffer);
  18. NSMutableString*outputString=[[NSMutableStringalloc]initWithCapacity:CC_MD5_DIGEST_LENGTH*2];
  19. for(NSIntegercount=0;count<CC_MD5_DIGEST_LENGTH;count++){
  20. [outputStringappendFormat:@"%02x",outputBuffer[count]];
  21. }
  22. returnoutputString;
  23. }
  24. -(NSString*)encode
  25. {
  26. NSString*outputStr=(NSString*)
  27. CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
  28. (CFStringRef)self,
  29. NULL,
  30. NULL,
  31. kCFStringEncodingUTF8));
  32. returnoutputStr;
  33. }
  34. -(NSString*)decode
  35. {
  36. NSMutableString*outputStr=[NSMutableStringstringWithString:self];
  37. [outputStrreplaceOccurrencesOfString:@"+"withString:@""options:NSLiteralSearchrange:NSMakeRange(0,[outputStrlength])];
  38. return[outputStrstringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  39. }
  40. -(id)object
  41. {
  42. idobject=nil;
  43. @try{
  44. NSData*data=[selfdataUsingEncoding:NSUTF8StringEncoding];;
  45. object=[NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableLeaveserror:nil];
  46. }
  47. @catch(NSException*exception){
  48. NSLog(@"%s[Line%d]JSON字符串转换成对象出错了--> %@",__PRETTY_FUNCTION__,__LINE__,exception);
  49. }
  50. @finally{
  51. }
  52. returnobject;
  53. }
  54. @end
  55. @implementationNSObject(HttpManager)
  56. -(NSString*)json
  57. {
  58. NSString*jsonStr=@"";
  59. @try{
  60. NSData*jsonData=[NSJSONSerializationdataWithJSONObject:selfoptions:0error:nil];
  61. jsonStr=[[NSStringalloc]initWithData:jsonDataencoding:NSUTF8StringEncoding];
  62. }
  63. @catch(NSException*exception){
  64. NSLog(@"%s[Line%d]对象转换成JSON字符串出错了--> %@",__PRETTY_FUNCTION__,__LINE__,exception);
  65. }
  66. @finally{
  67. }
  68. returnjsonStr;
  69. }
  70. @end
  71. @interfaceHttpManager()
  72. {
  73. AFHTTPRequestOperationManager*operationManager;
  74. }
  75. @end
  76. @implementationHttpManager
  77. -(id)init{
  78. self=[superinit];
  79. if(self){
  80. operationManager=[AFHTTPRequestOperationManagermanager];
  81. operationManager.responseSerializer.acceptableContentTypes=nil;
  82. NSURLCache*urlCache=[NSURLCachesharedURLCache];
  83. [urlCachesetMemoryCapacity:5*1024*1024];/*设置缓存的大小为5M*/
  84. [NSURLCachesetSharedURLCache:urlCache];
  85. }
  86. returnself;
  87. }
  88. +(HttpManager*)defaultManager
  89. {
  90. staticdispatch_once_tpred=0;
  91. __strongstaticiddefaultHttpManager=nil;
  92. dispatch_once(&pred,^{
  93. defaultHttpManager=[[selfalloc]init];
  94. });
  95. returndefaultHttpManager;
  96. }
  97. -(void)getRequestToUrl:(NSString*)urlparams:(NSDictionary*)paramscomplete:(void(^)(BOOLsuccessed,NSDictionary*result))complete
  98. {
  99. [selfrequestToUrl:urlmethod:@"GET"useCache:NOparams:paramscomplete:complete];
  100. }
  101. -(void)getCacheToUrl:(NSString*)urlparams:(NSDictionary*)paramscomplete:(void(^)(BOOLsuccessed,NSDictionary*result))complete
  102. {
  103. [selfrequestToUrl:urlmethod:@"GET"useCache:YESparams:paramscomplete:complete];
  104. }
  105. -(void)postRequestToUrl:(NSString*)urlparams:(NSDictionary*)paramscomplete:(void(^)(BOOLsuccessed,NSDictionary*result))complete
  106. {
  107. [selfrequestToUrl:urlmethod:@"POST"useCache:NOparams:paramscomplete:complete];
  108. }
  109. -(void)requestToUrl:(NSString*)urlmethod:(NSString*)methoduseCache:(BOOL)useCache
  110. params:(NSDictionary*)paramscomplete:(void(^)(BOOLsuccessed,NSDictionary*result))complete
  111. {
  112. params=[[HttpManagergetRequestBodyWithParams:params]copy];
  113. AFHTTPRequestSerializer*serializer=[AFHTTPRequestSerializerserializer];
  114. NSMutableURLRequest*request=[serializerrequestWithMethod:methodURLString:urlparameters:paramserror:nil];
  115. [requestsetTimeoutInterval:10];
  116. if(useCache){
  117. [requestsetCachePolicy:NSURLRequestReturnCacheDataElseLoad];
  118. }
  119. void(^requestSuccessBlock)(AFHTTPRequestOperation*operation,idresponseObject)=^(AFHTTPRequestOperation*operation,idresponseObject){
  120. [selfshowMessageWithOperation:operationmethod:methodparams:params];
  121. complete?complete(true,responseObject):nil;
  122. };
  123. void(^requestFailureBlock)(AFHTTPRequestOperation*operation,NSError*error)=^(AFHTTPRequestOperation*operation,NSError*error){
  124. [selfshowMessageWithOperation:operationmethod:methodparams:params];
  125. complete?complete(false,nil):nil;
  126. };
  127. AFHTTPRequestOperation*operation=nil;
  128. if(useCache){
  129. operation=[selfcacheOperationWithRequest:requestsuccess:requestSuccessBlockfailure:requestFailureBlock];
  130. }else{
  131. operation=[operationManagerHTTPRequestOperationWithRequest:requestsuccess:requestSuccessBlockfailure:requestFailureBlock];
  132. }
  133. [operationManager.operationQueueaddOperation:operation];
  134. }
  135. -(AFHTTPRequestOperation*)cacheOperationWithRequest:(NSURLRequest*)urlRequest
  136. success:(void(^)(AFHTTPRequestOperation*operation,idresponseObject))success
  137. failure:(void(^)(AFHTTPRequestOperation*operation,NSError*error))failure
  138. {
  139. AFHTTPRequestOperation*operation=[operationManagerHTTPRequestOperationWithRequest:urlRequestsuccess:^(AFHTTPRequestOperation*operation,idresponseObject){
  140. NSCachedURLResponse*cachedURLResponse=[[NSURLCachesharedURLCache]cachedResponseForRequest:urlRequest];
  141. //storeincache
  142. cachedURLResponse=[[NSCachedURLResponsealloc]initWithResponse:operation.responsedata:operation.responseDatauserInfo:nilstoragePolicy:NSURLCacheStorageAllowed];
  143. [[NSURLCachesharedURLCache]storeCachedResponse:cachedURLResponseforRequest:urlRequest];
  144. success(operation,responseObject);
  145. }failure:^(AFHTTPRequestOperation*operation,NSError*error){
  146. if(error.code==kCFURLErrorNotConnectedToInternet){
  147. NSCachedURLResponse*cachedResponse=[[NSURLCachesharedURLCache]cachedResponseForRequest:urlRequest];
  148. if(cachedResponse!=nil&&[[cachedResponsedata]length]>0){
  149. success(operation,cachedResponse.data);
  150. }else{
  151. failure(operation,error);
  152. }
  153. }else{
  154. failure(operation,error);
  155. }
  156. }];
  157. returnoperation;
  158. }
  159. -(AFHTTPRequestOperation*)uploadToUrl:(NSString*)url
  160. params:(NSDictionary*)params
  161. files:(NSArray*)files
  162. complete:(void(^)(BOOLsuccessed,NSDictionary*result))complete
  163. {
  164. return[selfuploadToUrl:urlparams:paramsfiles:filesprocess:nilcomplete:complete];
  165. }
  166. -(AFHTTPRequestOperation*)uploadToUrl:(NSString*)url
  167. params:(NSDictionary*)params
  168. files:(NSArray*)files
  169. process:(void(^)(NSIntegerwritedBytes,NSIntegertotalBytes))process
  170. complete:(void(^)(BOOLsuccessed,NSDictionary*result))complete
  171. {
  172. params=[[HttpManagergetRequestBodyWithParams:params]copy];
  173. FLOG(@"postrequesturl:%@ postparams:%@",url,params);
  174. AFHTTPRequestSerializer*serializer=[AFHTTPRequestSerializerserializer];
  175. NSMutableURLRequest*request=[serializermultipartFormRequestWithMethod:@"POST"URLString:urlparameters:paramsconstructingBodyWithBlock:^(id<AFMultipartFormData>formData){
  176. for(NSDictionary*fileIteminfiles){
  177. idvalue=[fileItemobjectForKey:@"file"];//支持四种数据类型:NSData、UIImage、NSURL、NSString
  178. NSString*name=@"file";//字段名称
  179. NSString*fileName=[fileItemobjectForKey:@"name"];//文件名称
  180. NSString*mimeType=[fileItemobjectForKey:@"type"];//文件类型
  181. mimeType=mimeType?mimeType:@"image/jpeg";
  182. if([valueisKindOfClass:[NSDataclass]]){
  183. [formDataappendPartWithFileData:valuename:namefileName:fileNamemimeType:mimeType];
  184. }elseif([valueisKindOfClass:[UIImageclass]]){
  185. if(UIImagePNGRepresentation(value)){//返回为png图像。
  186. [formDataappendPartWithFileData:UIImagePNGRepresentation(value)name:namefileName:fileNamemimeType:mimeType];
  187. }else{//返回为JPEG图像。
  188. [formDataappendPartWithFileData:UIImageJPEGRepresentation(value,0.5)name:namefileName:fileNamemimeType:mimeType];
  189. }
  190. }elseif([valueisKindOfClass:[NSURLclass]]){
  191. [formDataappendPartWithFileURL:valuename:namefileName:fileNamemimeType:mimeTypeerror:nil];
  192. }elseif([valueisKindOfClass:[NSStringclass]]){
  193. [formDataappendPartWithFileURL:[NSURLURLWithString:value]name:namefileName:fileNamemimeType:mimeTypeerror:nil];
  194. }
  195. }
  196. }error:nil];
  197. AFHTTPRequestOperation*operation=nil;
  198. operation=[operationManagerHTTPRequestOperationWithRequest:request
  199. success:^(AFHTTPRequestOperation*operation,idresponseObject){
  200. FLOG(@"postresponseObject:%@",responseObject);
  201. if(complete){
  202. complete(true,responseObject);
  203. }
  204. }failure:^(AFHTTPRequestOperation*operation,NSError*error){
  205. FLOG(@"posterror:%@",error);
  206. if(complete){
  207. complete(false,nil);
  208. }
  209. }];
  210. [operationsetUploadProgressBlock:^(NSUIntegerbytesWritten,NSIntegertotalBytesWritten,NSIntegertotalBytesExpectedToWrite){
  211. FLOG(@"uploadprocess:%.2d%%(%ld/%ld)",100*totalBytesWritten/totalBytesExpectedToWrite,(long)totalBytesWritten,(long)totalBytesExpectedToWrite);
  212. if(process){
  213. process(totalBytesWritten,totalBytesExpectedToWrite);
  214. }
  215. }];
  216. [operationstart];
  217. returnoperation;
  218. }
  219. -(AFHTTPRequestOperation*)downloadFromUrl:(NSString*)url
  220. filePath:(NSString*)filePath
  221. complete:(void(^)(BOOLsuccessed,NSDictionary*response))complete
  222. {
  223. return[selfdownloadFromUrl:urlparams:nilfilePath:filePathprocess:nilcomplete:complete];
  224. }
  225. -(AFHTTPRequestOperation*)downloadFromUrl:(NSString*)url
  226. params:(NSDictionary*)params
  227. filePath:(NSString*)filePath
  228. process:(void(^)(NSIntegerreadBytes,NSIntegertotalBytes))process
  229. complete:(void(^)(BOOLsuccessed,NSDictionary*response))complete
  230. {
  231. params=[[HttpManagergetRequestBodyWithParams:params]copy];
  232. AFHTTPRequestSerializer*serializer=[AFHTTPRequestSerializerserializer];
  233. NSMutableURLRequest*request=[serializerrequestWithMethod:@"GET"URLString:urlparameters:paramserror:nil];
  234. FLOG(@"getrequesturl:%@",[request.URL.absoluteStringdecode]);
  235. AFHTTPRequestOperation*operation=[[AFHTTPRequestOperationalloc]initWithRequest:request];
  236. operation.responseSerializer.acceptableContentTypes=nil;
  237. NSString*tmpPath=[filePathstringByAppendingString:@".tmp"];
  238. operation.outputStream=[[NSOutputStreamalloc]initToFileAtPath:tmpPathappend:NO];
  239. [operationsetCompletionBlockWithSuccess:^(AFHTTPRequestOperation*operation,idresponseObject){
  240. NSArray*mimeTypeArray=@[@"text/html",@"application/json"];
  241. NSError*moveError=nil;
  242. if([mimeTypeArraycontainsObject:operation.response.MIMEType]){
  243. //返回的是json格式数据
  244. responseObject=[NSDatadataWithContentsOfFile:tmpPath];
  245. responseObject=[NSJSONSerializationJSONObjectWithData:responseObjectoptions:2error:nil];
  246. [[NSFileManagerdefaultManager]removeItemAtPath:tmpPatherror:nil];
  247. FLOG(@"getresponseObject:%@",responseObject);
  248. }else{
  249. [[NSFileManagerdefaultManager]removeItemAtPath:filePatherror:nil];
  250. [[NSFileManagerdefaultManager]moveItemAtPath:tmpPathtoPath:filePatherror:&moveError];
  251. }
  252. if(complete&&!moveError){
  253. complete(true,responseObject);
  254. }else{
  255. complete?complete(false,responseObject):nil;
  256. }
  257. }failure:^(AFHTTPRequestOperation*operation,NSError*error){
  258. FLOG(@"geterror:%@",error);
  259. [[NSFileManagerdefaultManager]removeItemAtPath:tmpPatherror:nil];
  260. if(complete){
  261. complete(false,nil);
  262. }
  263. }];
  264. [operationsetDownloadProgressBlock:^(NSUIntegerbytesRead,NSIntegertotalBytesRead,NSIntegertotalBytesExpectedToRead){
  265. FLOG(@"downloadprocess:%.2d%%(%ld/%ld)",100*totalBytesRead/totalBytesExpectedToRead,(long)totalBytesRead,(long)totalBytesExpectedToRead);
  266. if(process){
  267. process(totalBytesRead,totalBytesExpectedToRead);
  268. }
  269. }];
  270. [operationstart];
  271. returnoperation;
  272. }
  273. +(NSMutableDictionary*)getRequestBodyWithParams:(NSDictionary*)params
  274. {
  275. NSMutableDictionary*requestBody=params?[paramsmutableCopy]:[[NSMutableDictionaryalloc]init];
  276. for(NSString*keyin[paramsallKeys]){
  277. idvalue=[paramsobjectForKey:key];
  278. if([valueisKindOfClass:[NSDateclass]]){
  279. [requestBodysetValue:@([valuetimeIntervalSince1970]*1000)forKey:key];
  280. }
  281. if([valueisKindOfClass:[NSDictionaryclass]]||[valueisKindOfClass:[NSArrayclass]]){
  282. [requestBodysetValue:[valuejson]forKey:key];
  283. }
  284. }
  285. NSString*token=[[NSUserDefaultsstandardUserDefaults]objectForKey:@"token"];
  286. if(token){
  287. [requestBodysetObject:tokenforKey:@"token"];
  288. }
  289. [requestBodysetObject:@"ios"forKey:@"genus"];
  290. returnrequestBody;
  291. }
  292. +(NetworkStatus)networkStatus
  293. {
  294. Reachability*reachability=[ReachabilityreachabilityWithHostname:@"www.apple.com"];
  295. //NotReachable-没有网络连接
  296. //ReachableViaWWAN-移动网络(2G、3G)
  297. //ReachableViaWiFi-WIFI网络
  298. return[reachabilitycurrentReachabilityStatus];
  299. }
  300. -(void)showMessageWithOperation:(AFHTTPRequestOperation*)operationmethod:(NSString*)methodparams:(NSDictionary*)params
  301. {
  302. NSString*urlAbsoluteString=[operation.request.URL.absoluteStringdecode];
  303. if([[methoduppercaseString]isEqualToString:@"GET"]){
  304. FLOG(@"getrequesturl:%@ ",urlAbsoluteString);
  305. }else{
  306. FLOG(@"%@requesturl:%@ postparams:%@ ",[methodlowercaseString],urlAbsoluteString,params);
  307. }
  308. if(operation.error){
  309. FLOG(@"%@error:%@",[methodlowercaseString],operation.error);
  310. }else{
  311. FLOG(@"%@responseObject:%@",[methodlowercaseString],operation.responseObject);
  312. }
  313. ////只显示一部分url
  314. //NSArray*ignordUrls=@[url_originalDataDownload,url_originalDataUpload,url_originalDataUploadFinished,url_getEarliestOriginalData,url_newVersion,
  315. //url_saveSyncFailInfo];
  316. //for(NSString*ignordUrlinignordUrls){
  317. //if([urlAbsoluteStringrangeOfString:ignordUrl].length){
  318. //return;
  319. //}
  320. //}
  321. ////弹出网络提示
  322. //if(!operation.error){
  323. //if([operation.responseObjectobjectForKey:@"msg"]&&[[operation.responseObjectobjectForKey:@"msg"]length]){
  324. //[KeyWindowshowAlertMessage:[operation.responseObjectobjectForKey:@"msg"]callback:nil];
  325. //}
  326. //}
  327. //else{
  328. //if(operation.error.code==kCFURLErrorNotConnectedToInternet){
  329. //[KeyWindowshowAlertMessage:@"您已断开网络连接"callback:nil];
  330. //}else{
  331. //[KeyWindowshowAlertMessage:@"服务器忙,请稍后再试"callback:nil];
  332. //}
  333. //}
  334. }
  335. @end

图片缓存类,用于缓存图片;并写了UIImageView和UIButton的扩展方法;可直接设置其对应图片的URL。

// ImageCache.h

  1. //
  2. //ImageCache.h
  3. //CoreDataUtil
  4. //
  5. //Createdbymarujunon14-1-18.
  6. //Copyright(c)2014年jizhi.Allrightsreserved.
  7. //
  8. #import<UIKit/UIKit.h>
  9. #import<UIKit/UIImageView.h>
  10. #import<UIKit/UIButton.h>
  11. #import<objc/runtime.h>
  12. #defineADD_DYNAMIC_PROPERTY(PROPERTY_TYPE,PROPERTY_NAME,SETTER_NAME)
  13. @dynamicPROPERTY_NAME;
  14. staticcharkProperty##PROPERTY_NAME;
  15. -(PROPERTY_TYPE)PROPERTY_NAME{
  16. return(PROPERTY_TYPE)objc_getAssociatedObject(self,&(kProperty##PROPERTY_NAME));
  17. }
  18. -(void)SETTER_NAME:(PROPERTY_TYPE)PROPERTY_NAME{
  19. objc_setAssociatedObject(self,&kProperty##PROPERTY_NAME,PROPERTY_NAME,OBJC_ASSOCIATION_RETAIN);
  20. }
  21. @interfaceUIImage(ImageCache)
  22. @property(nonatomic,strong)NSString*lastCacheUrl;
  23. /*********************----------*****************************
  24. 1、UIImage的扩展方法,用于缓存图片;如果图片已下载则使用本地图片
  25. 2、下载完成之后会执行回调,并可查看下载进度
  26. ********************----------******************************/
  27. +(void)imageWithURL:(NSString*)urlcallback:(void(^)(UIImage*image))callback;
  28. +(void)imageWithURL:(NSString*)url
  29. process:(void(^)(NSIntegerreadBytes,NSIntegertotalBytes))process
  30. callback:(void(^)(UIImage*image))callback;
  31. /*通过URL获取缓存图片在本地对应的路径*/
  32. +(NSString*)getImagePathWithURL:(NSString*)url;
  33. @end
  34. @interfaceUIImageView(ImageCache)
  35. @property(nonatomic,strong)NSString*lastCacheUrl;
  36. /*设置UIImageView的图片的URL,下载失败设置图片为空*/
  37. -(void)setImageURL:(NSString*)url;
  38. /*设置UIImageView的图片的URL,下载失败则使用默认图片设置*/
  39. -(void)setImageURL:(NSString*)urldefaultImage:(UIImage*)defaultImage;
  40. /*设置UIImageView的图片的URL,下载完成之后先设置图片然后执行回调函数*/
  41. -(void)setImageURL:(NSString*)urlcallback:(void(^)(UIImage*image))callback;
  42. @end
  43. @interfaceUIButton(ImageCache)
  44. @property(nonatomic,strong)NSString*lastCacheUrl;
  45. /*设置按钮的图片的URL,下载失败设置图片为空*/
  46. -(void)setImageURL:(NSString*)urlforState:(UIControlState)state;
  47. /*设置按钮的图片的URL,下载失败则使用默认图片设置*/
  48. -(void)setImageURL:(NSString*)urlforState:(UIControlState)statedefaultImage:(UIImage*)defaultImage;
  49. /*设置按钮的图片的URL,下载完成之后先设置图片然后执行回调函数*/
  50. -(void)setImageURL:(NSString*)urlforState:(UIControlState)statecallback:(void(^)(UIImage*image))callback;
  51. /*设置按钮的背景图片的URL,下载失败设置图片为空*/
  52. -(void)setBackgroundImageURL:(NSString*)urlforState:(UIControlState)state;
  53. /*设置按钮的背景图片的URL,下载失败则使用默认图片设置*/
  54. -(void)setBackgroundImageURL:(NSString*)urlforState:(UIControlState)statedefaultImage:(UIImage*)defaultImage;
  55. /*设置按钮的背景图片的URL,下载完成之后先设置图片然后执行回调函数*/
  56. -(void)setBackgroundImageURL:(NSString*)urlforState:(UIControlState)statecallback:(void(^)(UIImage*image))callback;
  57. @end

// ImageCache.m

  1. //
  2. //ImageCache.m
  3. //CoreDataUtil
  4. //
  5. //Createdbymarujunon14-1-18.
  6. //Copyright(c)2014年jizhi.Allrightsreserved.
  7. //
  8. #import"ImageCache.h"
  9. #import"HttpManager.h"
  10. staticNSMutableArray*downloadTaskArray_ImageCache;
  11. staticBOOLisDownloading_ImageCache;
  12. @implementationUIImage(ImageCache)
  13. ADD_DYNAMIC_PROPERTY(NSString*,lastCacheUrl,setLastCacheUrl);
  14. +(void)imageWithURL:(NSString*)urlcallback:(void(^)(UIImage*image))callback
  15. {
  16. [selfimageWithURL:urlprocess:nilcallback:callback];
  17. }
  18. +(void)imageWithURL:(NSString*)url
  19. process:(void(^)(NSIntegerreadBytes,NSIntegertotalBytes))process
  20. callback:(void(^)(UIImage*image))callback
  21. {
  22. if(!downloadTaskArray_ImageCache){
  23. downloadTaskArray_ImageCache=[[NSMutableArrayalloc]init];
  24. }
  25. NSString*filePath=[selfgetImagePathWithURL:url];
  26. if([[NSFileManagerdefaultManager]fileExistsAtPath:filePath]){
  27. UIImage*lastImage=[UIImageimageWithContentsOfFile:filePath];
  28. lastImage.lastCacheUrl=url?url:@"";
  29. callback?callback(lastImage):nil;
  30. }else{
  31. NSMutableDictionary*task=[[NSMutableDictionaryalloc]init];
  32. url?[tasksetObject:urlforKey:@"url"]:nil;
  33. process?[tasksetObject:processforKey:@"process"]:nil;
  34. callback?[tasksetObject:callbackforKey:@"callback"]:nil;
  35. [downloadTaskArray_ImageCacheaddObject:task];
  36. [selfstartDownload];
  37. }
  38. }
  39. +(void)startDownload
  40. {
  41. if(downloadTaskArray_ImageCache.count&&!isDownloading_ImageCache){
  42. NSDictionary*lastObj=[downloadTaskArray_ImageCachelastObject];
  43. [selfdownloadWithURL:lastObj[@"url"]process:lastObj[@"process"]callback:lastObj[@"callback"]];
  44. }
  45. }
  46. +(void)downloadWithURL:(NSString*)url
  47. process:(void(^)(NSIntegerreadBytes,NSIntegertotalBytes))process
  48. callback:(void(^)(UIImage*image))callback
  49. {
  50. NSString*filePath=[selfgetImagePathWithURL:url];
  51. NSMutableDictionary*task=[[NSMutableDictionaryalloc]init];
  52. url?[tasksetObject:urlforKey:@"url"]:nil;
  53. process?[tasksetObject:processforKey:@"process"]:nil;
  54. callback?[tasksetObject:callbackforKey:@"callback"]:nil;
  55. isDownloading_ImageCache=true;
  56. if([[NSFileManagerdefaultManager]fileExistsAtPath:filePath]){
  57. UIImage*lastImage=[UIImageimageWithContentsOfFile:filePath];
  58. lastImage.lastCacheUrl=url?url:@"";
  59. callback?callback(lastImage):nil;
  60. [downloadTaskArray_ImageCacheremoveObject:task];
  61. isDownloading_ImageCache=false;
  62. [selfstartDownload];
  63. }else{
  64. [[HttpManagerdefaultManager]downloadFromUrl:url
  65. params:nil
  66. filePath:filePath
  67. process:process
  68. complete:^(BOOLsuccessed,NSDictionary*result){
  69. if(callback){
  70. if(successed&&!result){
  71. UIImage*lastImage=[UIImageimageWithContentsOfFile:filePath];
  72. lastImage.lastCacheUrl=url?url:@"";
  73. callback?callback(lastImage):nil;
  74. }else{
  75. callback(nil);
  76. }
  77. }
  78. [downloadTaskArray_ImageCacheremoveObject:task];
  79. isDownloading_ImageCache=false;
  80. [selfstartDownload];
  81. }];
  82. }
  83. }
  84. +(NSString*)getImagePathWithURL:(NSString*)url
  85. {
  86. //先创建个缓存文件夹
  87. NSString*directory=[NSHomeDirectory()stringByAppendingPathComponent:@"Library/Caches/imgcache"];
  88. NSFileManager*defaultManager=[NSFileManagerdefaultManager];
  89. if(![defaultManagerfileExistsAtPath:directory]){
  90. [defaultManagercreateDirectoryAtPath:directorywithIntermediateDirectories:YESattributes:nilerror:nil];
  91. }
  92. return[directorystringByAppendingPathComponent:[urlmd5]];
  93. }
  94. @end
  95. @implementationUIImageView(ImageCache)
  96. ADD_DYNAMIC_PROPERTY(NSString*,lastCacheUrl,setLastCacheUrl);
  97. -(void)setImageURL:(NSString*)url
  98. {
  99. [selfsetImageURL:urlcallback:nil];
  100. }
  101. -(void)setImageURL:(NSString*)urldefaultImage:(UIImage*)defaultImage
  102. {
  103. defaultImage?self.image=defaultImage:nil;
  104. self.lastCacheUrl=url;
  105. [UIImageimageWithURL:urlcallback:^(UIImage*image){
  106. if([image.lastCacheUrlisEqualToString:self.lastCacheUrl]){
  107. image?self.image=image:nil;
  108. }
  109. }];
  110. }
  111. -(void)setImageURL:(NSString*)urlcallback:(void(^)(UIImage*image))callback
  112. {
  113. self.lastCacheUrl=url;
  114. [UIImageimageWithURL:urlcallback:^(UIImage*image){
  115. if([image.lastCacheUrlisEqualToString:self.lastCacheUrl]){
  116. image?self.image=image:nil;
  117. }
  118. callback?callback(image):nil;
  119. }];
  120. }
  121. @end
  122. @implementationUIButton(ImageCache)
  123. ADD_DYNAMIC_PROPERTY(NSString*,lastCacheUrl,setLastCacheUrl);
  124. -(void)setImageURL:(NSString*)urlforState:(UIControlState)state
  125. {
  126. [selfsetImageURL:urlforState:statedefaultImage:nil];
  127. }
  128. -(void)setImageURL:(NSString*)urlforState:(UIControlState)statedefaultImage:(UIImage*)defaultImage
  129. {
  130. defaultImage?[selfsetImage:defaultImageforState:state]:nil;
  131. self.lastCacheUrl=url;
  132. [UIImageimageWithURL:urlcallback:^(UIImage*image){
  133. if([image.lastCacheUrlisEqualToString:self.lastCacheUrl]){
  134. image?[selfsetImage:imageforState:state]:nil;
  135. }
  136. }];
  137. }
  138. -(void)setImageURL:(NSString*)urlforState:(UIControlState)statecallback:(void(^)(UIImage*image))callback
  139. {
  140. self.lastCacheUrl=url;
  141. [UIImageimageWithURL:urlcallback:^(UIImage*image){
  142. if([image.lastCacheUrlisEqualToString:self.lastCacheUrl]){
  143. image?[selfsetImage:imageforState:state]:nil;
  144. }
  145. callback?callback(image):nil;
  146. }];
  147. }
  148. -(void)setBackgroundImageURL:(NSString*)urlforState:(UIControlState)state
  149. {
  150. [selfsetBackgroundImageURL:urlforState:statedefaultImage:nil];
  151. }
  152. -(void)setBackgroundImageURL:(NSString*)urlforState:(UIControlState)statedefaultImage:(UIImage*)defaultImage
  153. {
  154. defaultImage?[selfsetBackgroundImage:defaultImageforState:state]:nil;
  155. self.lastCacheUrl=url;
  156. [UIImageimageWithURL:urlcallback:^(UIImage*image){
  157. if([image.lastCacheUrlisEqualToString:self.lastCacheUrl]){
  158. image?[selfsetBackgroundImage:imageforState:state]:nil;
  159. }
  160. }];
  161. }
  162. -(void)setBackgroundImageURL:(NSString*)urlforState:(UIControlState)statecallback:(void(^)(UIImage*image))callback
  163. {
  164. self.lastCacheUrl=url;
  165. [UIImageimageWithURL:urlcallback:^(UIImage*image){
  166. if([image.lastCacheUrlisEqualToString:self.lastCacheUrl]){
  167. image?[selfsetBackgroundImage:imageforState:state]:nil;
  168. }
  169. callback?callback(image):nil;
  170. }];
  171. }
  172. @end

  1. /*使用示例*/
  2. NSString*url=@"http://b.hiphotos.baidu.com/image/w%3D2048/sign=4c2a6e019058d109c4e3aeb2e560cdbf/b812c8fcc3cec3fd6d7daa0ad488d43f87942709.jpg";
  3. //缓存图片
  4. //[UIImageimageWithURL:urlprocess:^(NSIntegerreadBytes,NSIntegertotalBytes){
  5. //NSLog(@"下载进度:%.0f%%",100*readBytes/totalBytes);
  6. //}callback:^(UIImage*image){
  7. //NSLog(@"图片下载完成!");
  8. //}];
  9. //设置UIImageView的图片,下载失败则使用默认图片
  10. UIImageView*imageView=[[UIImageViewalloc]initWithFrame:self.view.bounds];
  11. [imageViewsetImageURL:urldefaultImage:[UIImageimageNamed:@"default.png"]];
  12. imageView.contentMode=UIViewContentModeScaleAspectFit;
  13. [self.viewaddSubview:imageView];
  14. //设置UIButton的图片,下载失败则使用默认图片
  15. UIButton*button=[[UIButtonalloc]initWithFrame:self.view.bounds];
  16. [buttonsetImageURL:urlforState:UIControlStateNormaldefaultImage:[UIImageimageNamed:@"default.png"]];
  17. [self.viewaddSubview:button];

GitHub 地址:https://github.com/marujun/DataManager


免责声明:文章转载自《AFNetWorking 的简单使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决ArcGIS中因SDE或数据库配置问题而导致服务宕掉的一种思路指针访问与数组访问的效率分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Node.js 文件系统

Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API。 Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。 异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。 建议大家使用异...

js 回调函数

回调函数定义: A callback is a function that is passed as an argument to another function and is executed after its parent function has completed。 一个回调是一个函数被传递一个参数到另外一个函数,被执行在主函数完成后 n...

jQuery基础【1】

jQuery 是一个“写的更少,但做的更多”的轻量级 JavaScript 库。jQuery 极大地简化了 JavaScript 编程。jQuery 很容易学习。jQuery 库位于一个 JavaScript 文件中,其中包含了所有的 jQuery 函数。jQuery 是一个 JavaScript 函数库。jQuery 库包含以下特性:   •HTML 元...

WKWebView使用遇到的一些坑

https://www.jianshu.com/p/c73bd50560ee WKWebView使用遇到的坑 简介 使用WKWebView一段时间,发现它和UIWebView的一些区别之处,有一写遇到的坑,现在对处理方式做了个小总结,现分享给大家. 区别 1.EvaluateJavaScript方法为异步 UIWebview: 在UIWebView中是...

SDWebImage播放GIF图

播放GIF图有好几种方法 1.可以直接用ImageView一帧一帧的播放 2.可以用WebView加载一个页面播放 . . . 但是它们的缺点比较明显,会失帧,如果图比较大多话,还有可能在屏幕比较小的设备上不能完全显示出来, SDWebImage提供了很好的方法,只要导入播放GIF的头文件,只需短短的几行代码就可以实现。示例代码如下: #import "V...

iOS 三方库fmdb 的使用

使用fmdb 做本地数据的存储非常方便, 1. github 上搜索fmdb 下载压缩包 导入到工程中 (如果你的mac 有cocoapod 也可以直接通过cocoapod 添加) 2. 以下代码是通过fmdb 多数据库的各种操作,其中有几点需要注意:(1). 程序中 Ceasar 是表名 (2). 修改数据库数据 提前准备字符串时 值 要用单引号括起来...