苹果公司使用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];