NSURLSession
- 他是一个基类,不能直接使用,需要使用它的子类
NSURLSessionDataTask
,NSURLSessionUploadTask
NSURLSessionDownloadTask
NSURLSessionConfiguration
NSURLSessionConfiguration
是用来配置NSURLSession
一些信息的,比如:请求时间,defaultSessionConfiguration
创建对象,默认是标准的配置ephemeralSessionConfiguration
创建对象,一个预设配置,没有持久性存储的缓存,Cookie或证书。这对于实现像"秘密浏览"功能的功能来说,是很理想的backgroundSessionConfiguration
创建对象,它会创建一个后台会话。后台会话不同于常规的,普通的会话,它甚至可以在应用程序挂起,退出,崩溃的情况下运行上传和下载任务。初始化时指定的标识符,被用于向任何可能在进程外恢复后台传输的守护进程提供上下文
NSURLConnection 在
iOS9
之后就过期了,苹果推出了NSURLSession
类来代替NSURLConnection
get请求
- 注意:
NSURLSessionDataTask
任务的回调执行是在子线程中的,注意线程之间的通信
- (void)getData
{
//获取网址
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost/iOS/demo.json"]];
//创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//创建session 回话
NSURLSession *session = [NSURLSession sharedSession];
//创建任务
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@",obj);
}];
//执行任务
[dataTask resume];
}
代理方法请求
//设置代理 遵循协议
- (void)setupDataWithDelegate {
//获取网址
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost/iOS/demo.json"]];
//创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//创建回话对象
/*
1.配置信息
*/
NSURLSessionConfiguration *defa = [NSURLSessionConfiguration defaultSessionConfiguration];
//使用的队列
NSOperationQueue *queue = [NSOperationQueue mainQueue];
NSURLSession *session = [NSURLSession sessionWithConfiguration:defa delegate:self delegateQueue:queue];
//创建任务
NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
//执行
[task resume];
}
//代理方法
//做出响应的时候
/*
NSURLSessionResponseCancel = 0,
NSURLSessionResponseAllow = 1,
NSURLSessionResponseBecomeDownload = 2,
NSURLSessionResponseBecomeStream
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler{
//NSURLSessionResponseDisposition 响应描述 是一个枚举值
//继续响应该是取消
//必须回调传值,回去,就类似推送一样
//允许继续响应
completionHandler(NSURLSessionResponseAllow);
}
//接受数据的时候
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data{
id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@",obj);
}
//完成的时候
- (void)URLSession:(NSURLSession *)session task:(nonnull NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error{
}
POST请求
- (void)postData {
//获取网址
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost/iOS/demo.json"]];
//创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置请求方法
request.HTTPMethod = @"POST";
//设置请求体
request.HTTPBody = [@"userName=dd&psd=123" dataUsingEncoding:NSUTF8StringEncoding];
//创建session 回话
NSURLSession *session = [NSURLSession sharedSession];
//创建任务
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@--%@",obj,[NSThread currentThread]);
}];
//执行任务
[dataTask resume];
}
文件下载
1.获取URL 2.创建请求 3.创建会话 4.下载 任务 5.启动任务
- (void)getDown {
//1.获取URL
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost/pic.jpg"]];
//2.创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.创建会话
NSURLSession *session = [NSURLSession sharedSession];
//4.下载 任务
NSURLSessionDownloadTask *loadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//1.获取下载的文件名称
NSString *nameStr = response.suggestedFilename;
//获取名字
// NSString *nameStr = location.lastPathComponent;
//路径
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask , YES).lastObject;
NSString *fullPath = [cachePath stringByAppendingPathComponent:nameStr];
NSFileManager *manager = [NSFileManager defaultManager];
NSError *moveError = nil;
[manager moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:&moveError];
UIImage *image = [UIImage imageWithContentsOfFile:fullPath];
//异步函数 回到主队列
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
});
}];
//5.启动任务
[loadTask resume];
}
1.获取URL 2.创建请求
//1.获取URL
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost/pic.jpg"]];
//2.创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
3.创建会话 并设置代理遵循
NSURLSessionDownloadDelegate
4. 创建下载任务
5.启动任务
//配置
NSURLSessionConfiguration *def = [NSURLSessionConfiguration defaultSessionConfiguration];
//队列
NSOperationQueue *minqueue = [NSOperationQueue mainQueue];
//3.创建会话 并设置代理
NSURLSession *session = [NSURLSession sessionWithConfiguration:def delegate:self delegateQueue:minqueue];
//4.创建下载任务
NSURLSessionDownloadTask *loadTask = [session downloadTaskWithRequest:request];
//5.启动任务
[loadTask resume];
实现协议的方法
/**
下载s数据
@param session 会话对象
@param downloadTask 下载任务
@param bytesWritten 本次写入数据的大小
@param totalBytesWritten 下载文件数据的总大小
@param totalBytesExpectedToWrite 文件的总大小
*/
/**
下载s数据
@param session 会话对象
@param downloadTask 下载任务
@param bytesWritten 本次写入数据的大小
@param totalBytesWritten 下载文件数据的总大小
@param totalBytesExpectedToWrite 文件的总大小
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
NSLog(@"下载进度:%f",1.0*totalBytesWritten/totalBytesExpectedToWrite);
}
恢复下载的时候 调用
/**
恢复下载的时候 调用
@param session 会话对象
@param downloadTask 下载任务
@param fileOffset 从上次中断的地方继续下载
@param expectedTotalBytes 文件的总大小
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes{
}
下载完成的时候调用\
/**
下载完成的时候
@param session 会话对象
@param downloadTask 下载任务
@param location 现在完成时候的URL 临时存储在tmp文件里面
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location{
//1.获取下载的文件名称
NSString *nameStr = downloadTask.response.suggestedFilename;
//获取名字
// NSString *nameStr = location.lastPathComponent;
//路径
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask , YES).lastObject;
NSString *fullPath = [cachePath stringByAppendingPathComponent:nameStr];
NSFileManager *manager = [NSFileManager defaultManager];
NSError *moveError = nil;
[manager moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:&moveError];
UIImage *image = [UIImage imageWithContentsOfFile:fullPath];
self.imageView.image = image;
}
整个请求结束的时候 调用
//整个请求结束的时候 调用
- (void)URLSession:(NSURLSession *)session task:(nonnull NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error{
}