NSURLSessionTask是一个抽象子类,它有三个具体的子类是可以直接使用的:NSURLSessionDataTask,NSURLSessionUploadTask和NSURLSessionDownloadTask。
NSURLSessionDataTask
///发送get 请求,用于登录和请求数据/
//创建session对象
NSURLSession *session = [NSURLSession sharedSession];
//创建URL请求
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:login]];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
} ];
//开始执行
[task resume];
//发送post 请求//
NSURLSession *session = [NSURLSession sharedSession];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:login1]];
request.HTTPMethod = @"POST";
request.HTTPBody = [@"username=1231&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
[task resume];
使用代理方法请求数据///
//需要实现 NSURLSessionDataDelegate 协议
-(void)delegate
{
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
NSURLSessionDataTask *task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:vide0]]];
[task resume];
}
//接收到数据调用
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
[self.totalData appendData:data];
NSLog(@"%zd", self.totalData.length);
}
//接收到服务器响应时调用
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
//允许数据传输,必须设置
completionHandler(NSURLSessionResponseAllow);
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
//下载完成调用
NSLog(@"%@", error.description);
}
NSURLSessionDownloadTask 下载文件
-(void)downLoad
{
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:image]];
NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request];
[task resume];
}
//下载完成调用
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
//文件临时缓存地址,下载完成后需要将文件移动到其他地址
NSLog(@"%@", location);
NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *temp = [path stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
//创建文件URL地址
NSURL *url = [NSURL fileURLWithPath:temp];
NSLog(@"%@", temp);
//移动文件
[[NSFileManager defaultManager] moveItemAtURL:location toURL:url error:nil];
}
//接收到文件数据时调用,
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
NSLog(@"%zd", bytesWritten);
NSLog(@"%zd", totalBytesWritten);
}
//下载完成调用
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"didComplete");
}
NSURLSessionDownloadTask 断点下载文件
-(NSURLSessionDownloadTask *)task
{
if(_task == nil){
self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:vide0]];
_task = [self.session downloadTaskWithRequest:request];
}
return _task;
}
//开始、继续下载
- (IBAction)start:(id)sender {
//从上次取消或者下载失败的数据继续下载
self.task = [self.session downloadTaskWithResumeData:self.data];
[self.task resume];
}
//暂停
- (IBAction)pause:(id)sender {
// [self.task suspend];
//取消下载并保存之前下载的数据,继续下载时可以使用保存的数据
[self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
self.data = resumeData;
}];
}
//停止
- (IBAction)stop:(id)sender {
[self.task cancel];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self.progressView setProgress:0];
self.data = nil;
}];
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
NSLog(@"%@", location);
NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *temp = [path stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
NSURL *url = [NSURL fileURLWithPath:temp];
NSLog(@"%@", temp);
[[NSFileManager defaultManager] moveItemAtURL:location toURL:url error:nil];
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
CGFloat progress = 1.0 * totalBytesWritten / totalBytesExpectedToWrite ;
NSLog(@"%zd %zd %lf",bytesWritten, totalBytesExpectedToWrite, progress);
[self.progressView setProgress:progress];
}];
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"didComplete");
}