使用原生NSURLSession进行网络请求

苹果公司使用NSURLSession替换了NSURLConnection,再次对NSURLSession网络请求做一个简单介绍。

1.通过类方法直接进行网络请求

//创建请求路径

NSURL * url = [NSURL URLWithString:@"http://**************"];

//1.1.创建NSURLSession对象

NSURLSession * session = [NSURLSession sharedSession];

//1.2创建请求对象

NSMutableURLRequest * request = [[NSMutableURLRequest alloc]initWithURL:url];

//1.3创建任务,NSURLSession是系统抽象类,使用其子类进行网络请求,子类有NSURLSessionDataTask(数据请求,备注不止仅用于数据请求),NSURLSessionDownloadTask(上传),NSURLSessionDownloadTask(下载)

NSURLSessionDataTask * task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);

}];

//1.4启动数据请求,不启动不会进行网络请求,如需要取消可执行[task cancel];

[task resume];

2.通过代理方法进行网络请求

//创建请求路径

NSURL * url = [NSURL URLWithString:@"http://**************"];

//2.1创建NSURLSession对象,队列可传[[NSOperationQueue alloc]init]]或者主队列[NSOperationQueue mainQueue],如使用代理方法进行网络请求,此处不能用NSURLSession * session = [NSURLSession sharedSession];session.delegate = self的方式进行创建和设置代理,需要使用以下方法创建NSURLSession对象

NSURLSession * session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc]init]];

//2.2创建请求对象

NSMutableURLRequest * request = [[NSMutableURLRequest alloc]initWithURL:url];

//2.3创建任务

NSURLSessionDataTask * task = [session dataTaskWithRequest:request];

//2.4启动数据请求

[task resume];

启动网络请求后会调用以下代理方法:

/**

*1.接收到服务器响应

*/

-(void)URLSession:(NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveResponse:(nonnull NSURLResponse *)response completionHandler:(nonnull void (^)(NSURLSessionResponseDisposition))completionHandler{

//允许接收服务器响应,才会继续接收服务器返回数据

/**

*  NSURLSessionResponseBecomeDownload 调用下载代理

*  NSURLSessionResponseCancel 取消请求服务器数据

*  NSURLSessionResponseAllow 允许接收服务器请求

*/

completionHandler(NSURLSessionResponseAllow);

}

/**

*2.接收到返回数据(可能会被调用多次)

*/

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{

}

/**

*3.接收完毕或者接收失败调用(失败的话error有值,成功error为空)

*/

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{

}

3.下载文件

//创建请求路径

NSURL * url = [NSURL URLWithString:@"http://pic19.nipic.com/20120304/8289149_123215305117_2.jpg"];

//1.创建NSURLSession对象

NSURLSession * session = [NSURLSession sharedSession];

//2.获取下载任务

NSURLSessionDownloadTask * task =[session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {

//文件存放路径

NSString * toPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];

NSLog(@"%@",toPath);

//剪切临时的下载路径到文件存放路径

NSFileManager * fileMsg = [NSFileManager defaultManager];

[fileMsg moveItemAtURL:location toURL:[NSURL fileURLWithPath:toPath] error:nil];

}];

//3.启动任务

[task resume];

你可能感兴趣的:(使用原生NSURLSession进行网络请求)