(1)AFNetWorking是现在最流行的数据请求方法 不仅包含数据请求 还包含数据解析(也就是同时封装了系统请求类NSURLConnection 和 NSJSonSerialization、NSXMLParser) (2)能够兼容ios6.0 也兼容block语法 同时兼容arc
#import "AFHTTPRequestOperationManager.h"
#import "GDataXMLNode.h"
//json
#define kJSONUrlString @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1"
//xml的地址
#define kXMLUrlString @"http://wiapi.hexun.com/news/getlist4.0.php?pid=100234721&pc=20&pn=1&st=0"
createUI方法实现:
-(void)createUI
{
NSArray * array = @[@"JSon",@"XML"];
for(int i = 0;i<2;i++)
{
UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(100, 150 + 100 * i, 100, 40);
[btn setTitle:array[i] forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(pressBtn:) forControlEvents:UIControlEventTouchUpInside];
btn.tag = i + 1;
[self.view addSubview:btn];
}
self.navigationItem.title = @"AF进行数据异步请求";
}
-(void)pressBtn:(id)sender
{
UIButton * btn = (UIButton *)sender;
if(btn.tag == 1)
{
//<1>初始化请求队列管理者对象
AFHTTPRequestOperationManager*manager = [AFHTTPRequestOperationManager manager];
//<2>
//-----------扩展---------
//判断当前网络状态
/*
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2,
*/
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
if(status == AFNetworkReachabilityStatusReachableViaWiFi)
{
NSLog(@"WIFI");
}
else if (status == AFNetworkReachabilityStatusReachableViaWWAN)
{
NSLog(@"3G/GPRS");
}
else
{
NSLog(@"无网络连接");
}
}];
//开启网络监控
[manager.reachabilityManager startMonitoring];
//只要当前网络发生改变 就会立即调用block语句块
//<3>设置请求数据的样式 只在请求json数据的时候设置
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
//<4>开始请求数据并解析数据
[manager GET:kJSONUrlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//responseObject就是请求下来的数据
if([responseObject isKindOfClass:[NSDictionary class]])
{
//json数据
NSLog(@"%@",responseObject);
}
else if ([responseObject isKindOfClass:[NSData class]])
{
//xml数据
NSLog(@"%@",responseObject);
}
else if ([responseObject isKindOfClass:[NSArray class]])
{
//json数据
NSLog(@"%@",responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error:%@",error.description);
}];
}
else
{
//请求XML数据 AFNetWorking自带的xml数据解析类是NSXMLParser 该方法解析XML数据比较复杂 我们可以使用GData进行数据解析
//<1>设置请求队列的管理者对象
AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];
//<2>需要关闭AFNetWorking提供的XML数据解析方式
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//<3>开始异步请求 并且开始XML数据解析
[manager GET:kXMLUrlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
if([responseObject isKindOfClass:[NSData class]])
{
//使用GData进行xml数据解析
//<1>将所有数据都解析出来放在内存中
GDataXMLDocument * document = [[GDataXMLDocument alloc]initWithData:responseObject encoding:NSUTF8StringEncoding error:nil];
//<2>通过XPath查找解析的数据的路径
NSArray * elements = [document nodesForXPath:@"/doc/news/title" error:nil];
//<3>获取title数据
for(GDataXMLElement * element in elements)
{
NSLog(@"title:%@",element.stringValue);
//获取节点的内容
}
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error:%@",error.description);
}];
}
}
联系客服