iOS ASI--同步和异步请求
1.添加ASI框架到项目
1>ASI框架在判断网络状态时,依赖于Reachability,可以在苹果的官方文档里找到,也可以ASI的Sample例子里找到.
2>添加ASI所依赖的类库: SystemConfiguration是Reachability所需要的类库
3>如果是ARC项目,还要在Targets-Compile Sources-Compiler Flags里把ASI的.m文件,都置为 -fno-objc-arc
4>最后编译程序,看成功否
2.发起请求
2.1同步请求
// 设置url
NSURL *url = [NSURL URLWithString:@"http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139"];
// 设置请求
ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url];
request.timeOutSeconds = 10;
// 发起请求
[request startSynchronous];
// 拿到服务器返回的数据
if (request.error) {
NSLog(@"有错");
}else{
NSLog(@"状态码%d",request.responseStatusCode);
NSLog(@"返回的信息:%@",request.responseString);
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:request.responseData options:NSJSONReadingMutableLeaves error:nil];
NSLog(@"dict------%@",dict);
}
2.2 异步请求
// 设置url
NSURL *url = [NSURL URLWithString:@"http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139"];
// 设置请求
ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url];
// 设置代理
request.delegate = self;
// 发起请求
[request startAsynchronous];
#pragma mark - ASIHTTPRequestDelegate
-(void)requestStarted:(ASIHTTPRequest *)request{
NSLog(@"开始请求");
}
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data{
NSLog(@"正在接收服务器返回的数据"); // 该方法可能会被调多次,因为要拼接数据
}
- (void)requestFinished:(ASIHTTPRequest *)request{
NSLog(@"请求结束");
NSData *data = request.responseData; // 这样就可以拿到请求完成的最终数据
}
- (void)requestFailed:(ASIHTTPRequest *)request{
NSLog(@"请求失败");
}
用ASI做异步请求的坑点:
假设某应该有A,B两个控制器,点A控制器的导航按钮会跳到B控制器.在控制器B发起异步请求,请求正在进行中(也就是正在调代理方法request:didReceiveData:),此时点了返回键,返回到A控制器,也就是把B控制器干掉了,按上面异步请求代码会报坏内存访问的错误
因为request.delegate = B控制器,请求正在进行时,B控制器正在执行 [self request:xx didReceiveData:xx];如果把B控制器干掉,程序在执行[self request:xx didReceiveData:xx]这个方法时,找不到B控制器了,就会报坏内存访问的Error.
解决这个坑点的办法,在B控制的dealloc里把请求清除掉.标蓝代码是修改的代码
@property (nonatomic,strong) ASIHTTPRequest *request;
// 设置url
NSURL *url = [NSURL URLWithString:@"http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139"];
// 设置请求
self.request = [ASIHTTPRequest requestWithURL:url];
// 设置代理
self.request.delegate = self;
// 发起请求
[self.request startAsynchronous];
- (void)dealloc {
[self.request clearDelegatesAndCancel];
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。