免费开源的iOS开发学习平台

iOS开发之网络编程:9-常用网络内部类之NSURLConnection

在iOS9后,NSURLConnection相关方法被完全的弃用,iOS系统有向下兼容的特性,尽管NSURLConnection已经被弃用,但在开发中,其方法依然可以被使用,如果需要兼容到很低版本的iOS系统,我们就必须使用NSURLConnection类了。

1、NSURLConnection常用类

  • NSURL:请求地址

  • NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体等

  • NSMutableURLRequest:NSURLRequest的子类,当URL会变化时,就要用它。

  • NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送数据给服务器,并收集来自服务器的响应数据。

2、NSURLConnection的使用步骤

以使用POST请求为例,从聚合数据获取一些数据,做个简单介绍。

  • 获取请求网址
NSURL *url = [NSURL URLWithString:@"http://v.juhe.cn/weixin/query?"];
  • 封装请求,这里的request是可变的,重要数据会在保密后接在url上。
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  • 设置请求方式
[request setHTTPMethod:@"POST"];
  • 设置请求体(会把请求的数据转成data,达到用户信息保密的目的),APPKEY加到对应位置。
NSData *data = [@"key=您申请的KEY" dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
  • 发送请求
NSURLResponse *response = nil;
NSError *error = nil;
NSData *content = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
  • 获取数据
NSError *newError = nil;
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:content options:NSJSONReadingMutableContainers error:&newError];
NSDictionary *dict = dictionary[@"result"];
NSArray *arr = dict[@"list"];
NSDictionary *dic = arr[2];
NSLog(@"%@",dic[@"title"]);

运行效果:

  • 还可以设置代理,遵守对应的协议,来完成进一步需求。
[NSURLConnection connectionWithRequest:request delegate:self];
  • NSURLConnectionDelegate协议的代理方法,主要是用来判断连接状态,处理各类连接情况,常用的就是连接失败。
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    //  获取到对应错误信息。
    if(error) {
        NSLog(@"%@", [error localizedDescription]);
    }
}
  • NSURLConnectionDataDelegate协议的代理方法则主要是获取服务器响应,接收数据。
//收到服务器响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"收到服务器响应");
}
//可以多次拼接获取的数据 (self.myData是NSMutableData类型属性,是保存多次接收的数据的一个容器)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.myData appendData:data];
    NSLog(@"收到数据");
}
//完成数据接收
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSError *error = nil;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.myData options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:&error];
     if(error) {
        NSLog(@"%@", [error localizedDescription]);
    } 
    NSLog(@"%@", dic);
}