iOS进行网络请求时,使用NSURLSession方法。
(1)NSURLSession主要结合NSURL,NSURLRequest,NSURLSessionDataTask使用
(1-1)NSURL用来设置网络请求的地址
(1-2)NSURLRequest用来设置url请求,以及设置请求时相关参数设置(如:缓存、超时等)
(1-3)NSURLSessionDataTask来设置数据请求
(2)NSURLSession既有代理方式,又有block代码块方式(无同步,或异步之分);
注意
(1)创建NSURLSession时的NSURLSessionConfiguration设置
一般模式(default):工作模式类似于原来的NSURLConnection,可以使用缓存的Cache,Cookie,鉴权。
及时模式(ephemeral):不使用缓存的Cache,Cookie,鉴权。
后台模式(background):在后台完成上传下载,创建Configuration对象的时候需要给一个NSString的ID用于追踪完成工作的Session是哪一个(后面会讲到)。
(2)Task有三种子类:
NSURLSessionUploadTask:上传用的Task,传完以后不会再下载返回结果;
NSURLSessionDownloadTask:下载用的Task;
NSURLSessionDataTask:可以上传内容,上传完成后再进行下载。
1、代理方式
1-1、添加协议
NSURLSessionDelegate
1-2、实例化等操作
// 创建NSURLSession
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:queue];
// 创建NSURLRequest
// 图片地址
// NSString *string = @"http://img4.imgtn.bdimg.com/it/u=819265564,3078214620&fm=206&gp=0.jpg";
// 天气地址
NSString *string = @"http://api.k780.com:88/?app=weather.future&weaid=1&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
string = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // 请求地址中包含中文时进行转换
NSURL *url = [NSURL URLWithString:string];
NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url];
// 缓存
mutableRequest.cachePolicy = NSURLRequestUseProtocolCachePolicy;
// 请求超时
mutableRequest.timeoutInterval = 30.0;
// 请求方式POST、或GET
// mutableRequest.HTTPMethod = @"POST";
mutableRequest.HTTPMethod = @"GET";
// 创建NSURLSessionDataTask
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:self.mutableRequest];
// 开始网络请求
[dataTask resume];
// 停止请求网络
[dataTask cancel];
// 取消/关闭NSURLSession
[session finishTasksAndInvalidate];
1-3、代理方法实现
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{
NSLog(@"1 请求成功返回请求头信息 response = %@", response);
// 让任务继续正常进行.(如果没有写这行代码, 将不会执行下面的代理方法.)
completionHandler(NSURLSessionResponseAllow);
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
NSLog(@"2 请求成功返回接收到的信息 data = %@", data);
if (0 != data.length)
{
if (dataTask == self.dataTask)
{
[self.networkData appendData:data];
}
else if (dataTask == self.imageDataTask)
{
if (self.imageData == nil)
{
self.imageData = [[NSMutableData alloc] init];
}
[self.imageData appendData:data];
}
}
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"3 请求成功结束请求");
NSString *result = [[NSString alloc] initWithData:self.networkData encoding:NSUTF8StringEncoding];
NSLog(@"result = %@", result);
if (task == self.dataTask)
{
self.networkDict = [NSJSONSerialization JSONObjectWithData:self.networkData options:NSJSONReadingMutableContainers error:nil];
NSLog(@"resultDict = %@", self.networkDict);
if (self.networkDict && 0 != self.networkDict.count)
{
[self.tableview reloadData];
}
}
else if (task == self.imageDataTask)
{
UIImage *image = [UIImage imageWithData:self.imageData];
self.imageview.image = image;
}
}
- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(nullable NSError *)error
{
NSLog(@"4 请求失败");
}
2、block代码块方式
// 创建NSURLSession
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
// 创建NSURLRequest
// 图片地址
// NSString *string = @"http://img4.imgtn.bdimg.com/it/u=819265564,3078214620&fm=206&gp=0.jpg";
// 天气地址
NSString *string = @"http://api.k780.com:88/?app=weather.future&weaid=1&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
string = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // 请求地址中包含中文时进行转换
NSURL *url = [NSURL URLWithString:string];
NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url];
// 缓存
mutableRequest.cachePolicy = NSURLRequestUseProtocolCachePolicy;
// 请求超时
mutableRequest.timeoutInterval = 30.0;
// 请求方式POST、或GET
// mutableRequest.HTTPMethod = @"POST";
mutableRequest.HTTPMethod = @"GET";
// 创建NSURLSessionDataTask
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest: mutableRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
UIImage *image = [UIImage imageWithData:data];
self.imageview.image = image;
}];
// 开始网络请求
[dataTask resume];
// 停止请求网络
[dataTask cancel];
// 取消/关闭NSURLSession
[session finishTasksAndInvalidate];