iOS第三方 - AFNetworking_2.0版 02:如何使用
AFNetworking 2.0 如何使用
1 - 准备工作
① 导入第三方 SVProgressHUD (模拟下载进度)、AFNetworking、UIKit+AFNetworking
注:MRC 环境下需要 TARGETS / Build Phases / Compile Sources,items的Compiler Flags 修改成 -fobjc-arc
② 添加类库(建议):Security.framework、MobileCoreServices.framework、SystemConfiguration.framework
③ 随便拖几个控件,效果如下
2 - 代码示例
// - ViewController.h
1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UIViewController 4 5 - (IBAction)JsonRequest01:(id)sender; 6 - (IBAction)JsonRequest02:(id)sender; 7 - (IBAction)PostGetDatajson:(id)sender; 8 - (IBAction)XMLGetData:(id)sender; 9 - (IBAction)GetImage:(id)sender; 10 11 @property (weak, nonatomic) IBOutlet UIImageView *showImage; 12 13 @end
// - ViewController.m
1 #import "ViewController.h" 2 #import "AFNetworking.h" 3 #import "UIImageView+AFNetworking.h" 4 #import "SVProgressHUD.h" // 模拟下载进度 5 @implementation ViewController 6 7 - (void)viewDidLoad { 8 9 [super viewDidLoad]; 10 self.view.backgroundColor = [UIColor cyanColor]; 11 12 } 13 14 // 下载图片(异步) 15 // AF 内部是通过队列实现且图片会有缓存,下次请求相同的链接时,系统会自动调用缓存,而不从网上请求数据 16 - (IBAction)GetImage:(id)sender { 17 18 NSString *urlString = @"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F202006%2F24%2F20200624221308_jqelj.jpg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1650530529&t=51e735c5e6c3ae8ccf2c566b36cbfa40"; 19 // AF 方法:setImageWithURL 20 [self.showImage setImageWithURL:[NSURL URLWithString:urlString] placeholderImage:[UIImage imageNamed:@"demo.jpg"]]; 21 } 22 23 // xml 解析:需要实现苹果自带的 NSXMLParserDelegate 委托方法 24 // XML 中有一些不需要的协议格式内容,所以就不能像 json 那样解析 25 - (IBAction)XMLGetData:(id)sender { 26 27 NSString * urlString = @"http://f.apiplus.cn/cqssc-20.xml"; 28 AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager]; 29 manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; 30 [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 31 32 NSLog(@"%@",responseObject); 33 NSXMLParser *xmlPaeser = (NSXMLParser*)responseObject; 34 xmlPaeser.delegate = self; 35 [xmlPaeser parse]; 36 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 37 38 NSLog(@"%@",error); 39 }]; 40 } 41 42 // post 请求 43 - (IBAction)PostGetDatajson:(id)sender { 44 45 NSString *urlString = @"http://api.tudou.com/v3/gw"; 46 NSString *paramString = @"method=user.item.get&appKey=43db911a75b88c11&format=json&user=ttr2008&pageNo=1&pageSize=10"; 47 NSDictionary *paramDic = [self getParamsFromParamString:paramString]; 48 49 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 50 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 51 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"]; 52 [manager POST:urlString parameters :paramDic success:^(AFHTTPRequestOperation *operation, id responseObject) { 53 54 id dict = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil]; 55 NSLog(@"%@",dict); 56 57 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 58 59 NSLog(@"错误: %@", error); 60 }]; 61 } 62 63 // Get请求:使用 AFHTTPRequestOperationManager 64 - (IBAction)JsonRequest02:(id)sender { 65 66 NSString *str = [[NSString stringWithFormat:@"http://dynamic.recommend.app.m.letv.com/android/dynamic.php?mod=mob&ctl=home55&act=index&evid=42AA25C7-5ACB-4B79-94A5-1E7B37EA3158&uid=31449873&history=20513811-2241823-20037856-20102976-20061370-20095963-20101199-2243902-20064922-2089883&pcode=010210000&version=5.5"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 67 68 AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init]; 69 // 通知 manager 只下载原始数据(不进行数据解析) 70 // 如不写此语句则自动解析成 NCObject 数据(由于做服务器的人返回 json 数据往往不规范, AF 检查很严格,会导致 json 解析往往失败) 71 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 72 // 请求参数 73 NSDictionary *dict = @{@"page":@"2"}; 74 // 开始请求 75 AFHTTPRequestOperation *operation1 = [manager GET:str parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) { 76 77 // 不通知 AFN 只下载原始数据的话,responseObject 返回的是原始数据;反之,是 NCObject 数据 78 //NSLog(@"%@",responseObject); 79 80 // 解析数据 81 id dict = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil]; 82 NSLog(@"parase json is%@",dict); 83 84 85 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 86 87 NSLog(@"%@",error); 88 }]; 89 90 // SVProgressHUD:模拟进度条 91 [operation1 setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { 92 93 CGFloat precent = (CGFloat)totalBytesRead / totalBytesExpectedToRead;// 当前已经读取的进度,需要转换 94 [SVProgressHUD showProgress:precent maskType:SVProgressHUDMaskTypeGradient]; 95 if (precent -1.0==0) { 96 97 [SVProgressHUD dismiss]; 98 } 99 }]; 100 [operation1 start]; 101 } 102 103 // Get请求:使用 AFHTTPRequestOperation 104 - (IBAction)JsonRequest01:(id)sender { 105 106 NSString *str = [NSString stringWithFormat:@"http://dynamic.recommend.app.m.letv.com/android/dynamic.php?mod=mob&ctl=home55&act=index&evid=42AA25C7-5ACB-4B79-94A5-1E7B37EA3158&uid=31449873&history=20513811-2241823-20037856-20102976-20061370-20095963-20101199-2243902-20064922-2089883&pcode=010210000&version=5.5"]; 107 NSURL *baseURL = [NSURL URLWithString:str]; 108 NSURLRequest *request = [NSURLRequest requestWithURL:baseURL]; 109 110 AFHTTPRequestOperation *operation01 = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 111 __weak AFHTTPRequestOperation *weakOperation01 = operation01; 112 [operation01 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 113 114 // 数据解析 115 // 方式一:responseObject 116 id dic01 = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil]; 117 NSLog(@"方式一 / parase json is%@",dic01); 118 119 // 方式二:使用 operation.responseString 120 NSString *reString = operation.responseString;// 等价于 NSString *reString = weakOperation01.responseString; 121 NSData *data2 = [reString dataUsingEncoding:NSUTF8StringEncoding]; 122 id dic02 = [NSJSONSerialization JSONObjectWithData:data2 options:0 error:nil]; 123 NSLog(@"方式二 / parase json is%@",dic02); 124 125 // 方式三:使用 operation.responseData 126 NSData *data3 = operation.responseData; 127 id dict03 = [NSJSONSerialization JSONObjectWithData:data3 options:0 error:nil]; 128 NSLog(@"方式三 / parase json is%@",dict03); 129 130 131 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 132 133 NSLog(@"%@",error); 134 }]; 135 136 [operation01 start]; 137 138 } 139 140 // 获取请求参数 141 - (NSDictionary *)getParamsFromParamString : (NSString *)paramString{ 142 143 NSMutableDictionary * paramDic = [NSMutableDictionary dictionaryWithCapacity:1]; 144 NSArray * array = [paramString componentsSeparatedByString:@"&"]; 145 146 for (NSString * str in array) { 147 148 NSArray * smallArray = [str componentsSeparatedByString:@"="]; 149 [paramDic setObject:[smallArray lastObject] forKey:[smallArray firstObject]]; 150 } 151 //NSLog(@"%@",paramDic); 152 return [NSDictionary dictionaryWithDictionary:paramDic]; 153 } 154 155 #pragma mark - <NSXMLParserDelegate> 156 // 解析起始标记 157 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 158 159 NSLog(@"开始标记%@",elementName); 160 } 161 162 // 解析文本节点 163 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 164 165 NSLog(@"%@",string); 166 } 167 168 // 解析结束标记 169 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 170 171 NSLog(@"结束标记%@",elementName); 172 } 173 174 // 文档结束时触发 175 -(void) parserDidEndDocument:(NSXMLParser *)parser{ 176 177 NSLog(@"解析结束!"); 178 } 179 180 // 错误发生 181 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{ 182 183 NSLog(@"error = %@",parseError); 184 } 185 186 @end
运行效果:下载图片
分类:
iOS第三方库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)