刚刚接触IOS开发,虽然听说过AFNetworking等有名的框架,但是由于只是想实现简单的Get请求,所以决定使用IOS自带的NSURLSession框架。
1.首先是构建出一个NSURLSession
//构建一个URL
NSURL *url = [[NSURL alloc] initWithString:@"http://..."];
//创建一个request对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:2.0f];
//创建session,并设置委托,用于监听请求
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self.delegate delegateQueue:[[NSOperationQueue alloc] init]];
2.接下来则是同步请求的写法
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@ %@ %@ %@", data, response, error, [NSThread currentThread]);
}];
3.异步请求的写法
//初始化任务
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
//发送请求(执行Task)
[dataTask resume];
这里主要讲一下异步请求如何获取数据
首先先了解一下NSURLSession
的协议NSURLSessionDataDelegate
的两个委托方法
//接收到服务器端传输的数据时的回调方法
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
//按顺序拼接服务器传输的数据:数据一般分多次返回,每次返回的数据量跟当前的网络状态、和 服务器当前正在处理的请求个数有个
[_result appendData:data];
}
/**
* 请求结束或者是失败的时候调用
* @param session 会话对象
* @param error 错误信息
*/
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"接收到得到数据是%@",_result);
//清空数据
[_result resetBytesInRange:NSMakeRange(0, self.result.length)];
_result.length = 0;
}
由于数据量过大是多次接受,而第二个函数又没有参数可以得到所有数据,因此一般做法是定义一个NSMutableData
变量存获得的数据存取数据。
4.最后是对数据的处理,这个根据业务各有不同,下面是我对数据解析的一般写法,讲数据转化为字典处理
/将字符串写到缓冲区。
NSString *data = [[NSString alloc] initWithData:_result encoding:NSUTF8StringEncoding];
NSData* jsonData = [data dataUsingEncoding:NSUTF8StringEncoding];
//解析json数据,使用系统方法 JSONObjectWithData: options: error:
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];