IOS-网络(NSURLSession)

 一、NSURLSession的基本用法

  1 //
  2 //  ViewController.m
  3 //  NSURLSession
  4 //
  5 //  Created by ma c on 16/2/1.
  6 //  Copyright © 2016年 博文科技. All rights reserved.
  7 //
  8 
  9 #import "ViewController.h"
 10 
 11 @interface ViewController ()<NSURLSessionDownloadDelegate>
 12 
 13 @end
 14 
 15 @implementation ViewController
 16 /*
 17  任务:任何请求都是一个任务
 18  
 19  NSURLSessionDataTask:普通的GET、POST请求
 20  NSURLSessionDownloadTask:文件下载
 21  NSURLSessionUploadTask:文件上传
 22  
 23  注意:如果给下载任务设置了completionHandler这个block,也实现了下载代理方法,优先执行block
 24 
 25  */
 26 - (void)viewDidLoad {
 27     [super viewDidLoad];
 28     
 29     self.view.backgroundColor = [UIColor cyanColor];
 30 
 31 }
 32 
 33 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
 34 {
 35 //    [self sendGetRequest];
 36 //    [self sendPostRequest];
 37 //    [self downlaodTask1];
 38     [self downlaodTask2];
 39 }
 40 
 41 #pragma mark - NSURLSessionDownloadTask2
 42 ///下载任务(有下载进度)
 43 - (void)downlaodTask2
 44 {
 45     //1.创建Session对象
 46     NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration];
 47     NSURLSession *session = [NSURLSession sessionWithConfiguration:cfg delegate:self delegateQueue:[NSOperationQueue mainQueue]];
 48     //2.创建一个任务
 49     NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos/minion_02.mp4"];
 50     NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url];
 51     //3.开始任务
 52     [task resume];
 53 }
 54 
 55 #pragma mark - NSURLSessionDownloadDelegate的代理方法
 56 ///下载完毕时调用
 57 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
 58 {
 59     NSLog(@"didFinishDownloadingToURL--->%@",location);
 60     //location:文件的临时路径,下载好的文件
 61     NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, nil) lastObject];
 62     NSString *file = [caches stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
 63     
 64     //降临时文件夹,剪切或者复制到Caches文件夹
 65     NSFileManager *mgr = [NSFileManager defaultManager];
 66     [mgr moveItemAtPath:location.path toPath:file error:nil];
 67 }
 68 ///恢复下载时调用
 69 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
 70 {
 71     
 72 }
 73 ///每当写完一部分就调用(根据文件大小调用多次)
 74 //bytesWritten:             这次调用写了多少
 75 //totalBytesWritten:        累计写了多少长度到沙河中
 76 //totalBytesExpectedToWrite:文件的总长度
 77 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
 78 {
 79     double progress = (double)totalBytesWritten / totalBytesExpectedToWrite;
 80     
 81     NSLog(@"下载进度--->%lf",progress);
 82     
 83 }
 84 
 85 #pragma mark - NSURLSessionDownloadTask1
 86 ///下载任务(不能看到下载进度)
 87 - (void)downlaodTask1
 88 {
 89     //1.创建Session对象
 90     NSURLSession *session = [NSURLSession sharedSession];
 91     //2.创建NSURL
 92     NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos/minion_02.mp4"];
 93     NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
 94        //location:文件的临时路径,下载好的文件
 95         NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, nil) lastObject];
 96         NSString *file = [caches stringByAppendingPathComponent:response.suggestedFilename];
 97         
 98         //降临时文件夹,剪切或者复制到Caches文件夹
 99         NSFileManager *mgr = [NSFileManager defaultManager];
100         [mgr moveItemAtPath:location.path toPath:file error:nil];
101         
102         //[mgr copyItemAtPath:location.path toPath:file error:nil];
103         
104         
105     }];
106     //3.开始任务
107     [task resume];
108 }
109 
110 
111 #pragma mark - NSURLSessionDataTask
112 ///POST请求
113 - (void)sendPostRequest
114 {
115     //1.创建Session对象
116     NSURLSession *session = [NSURLSession sharedSession];
117     
118     //2.创建NSURL
119     NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/login"];
120     //3.创建请求
121     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
122     request.HTTPMethod = @"POST";
123     //4.设置请求体
124     request.HTTPBody = [@"username=123&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];
125     //5.创建一个任务
126     NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
127         
128         NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data
129                                                              options:NSJSONReadingMutableLeaves error:nil];
130         NSLog(@"sendPostRequest:%@",dict);
131     }];
132     //6.开始任务
133     [task resume];
134 }
135 
136 ///GET请求
137 - (void)sendGetRequest
138 {
139     //1.得到session对象
140     NSURLSession *session = [NSURLSession sharedSession];
141     //2.创建一个任务
142     NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video"];
143     NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
144         
145         NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data
146                                                              options:NSJSONReadingMutableLeaves error:nil];
147         NSLog(@"sendGetRequest:%@",dict);
148     }];
149     //3.开始任务
150     [task resume];
151 }
152 @end

 二、NSURLSession的断点续传

  1 //
  2 //  ViewController.m
  3 //  IOS_0204_NSURLSession断点续传
  4 //
  5 //  Created by ma c on 16/2/4.
  6 //  Copyright © 2016年 博文科技. All rights reserved.
  7 //
  8 
  9 #import "ViewController.h"
 10 
 11 @interface ViewController ()<NSURLSessionDownloadDelegate>
 12 
 13 - (IBAction)btnClick:(UIButton *)sender;
 14 @property (weak, nonatomic) IBOutlet UIButton *btnClick;
 15 @property (weak, nonatomic) IBOutlet UIProgressView *progressView;
 16 
 17 @property (nonatomic, strong) NSURLSessionDownloadTask *task;
 18 @property (nonatomic, strong) NSData *resumeData;
 19 @property (nonatomic, strong) NSURLSession *session;
 20 
 21 @end
 22 
 23 @implementation ViewController
 24 
 25 - (void)viewDidLoad {
 26     [super viewDidLoad];
 27     
 28     self.progressView.progress = 0.01;
 29 }
 30 
 31 - (NSURLSession *)session
 32 {
 33     if (!_session) {
 34         //获得session
 35         NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration];
 36         _session = [NSURLSession sessionWithConfiguration:cfg delegate:self delegateQueue:[NSOperationQueue mainQueue]];
 37     }
 38     return _session;
 39 }
 40 
 41 
 42 - (IBAction)btnClick:(UIButton *)sender {
 43     //取反
 44     sender.selected = !sender.isSelected;
 45     
 46     if (sender.selected) { //开始、恢复下载
 47         
 48         if (self.resumeData) { //恢复下载
 49             [self resume];
 50             
 51         } else {  //开始下砸
 52             [self start];
 53         }
 54         
 55     } else { //暂停下载
 56         [self pause];
 57     }
 58 }
 59 //从零开始下载
 60 - (void)start
 61 {
 62     //1.创建一个下载任务
 63     NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos/minion_01.mp4"];
 64     self.task = [self.session downloadTaskWithURL:url];
 65     //2.开始任务
 66     [self.task resume];
 67 }
 68 //继续下载
 69 - (void)resume
 70 {
 71     //传入上次暂停下载返回的数据,就可以恢复下载
 72     self.task = [self.session downloadTaskWithResumeData:self.resumeData];
 73     
 74     [self.task resume];
 75 }
 76 //暂停下载
 77 - (void)pause
 78 {
 79     __weak typeof(self) vc = self;
 80     [self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
 81         
 82         //resumeData:包含了下载的开始位置
 83         vc.resumeData = resumeData;
 84         vc.task = nil;
 85         
 86     }];
 87 }
 88 #pragma mark - NSURLSessionDownloadDelegate的代理方法
 89 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
 90 {
 91     self.btnClick.selected = !self.btnClick.isSelected;
 92     
 93     NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
 94     //suggestedFilename建议使用的文件名,一般与服务器端的文件名一致
 95     NSString *file = [caches stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
 96     //NSLog(@"%@",file);
 97     NSFileManager *mgr = [NSFileManager defaultManager];
 98     //将临时文件复制或者剪切到caches文件夹
 99     [mgr moveItemAtPath:location.path toPath:file error:nil];
100     
101 }
102 
103 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
104 {
105     
106 }
107 
108 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
109 {
110     //获得下载进度
111     self.progressView.progress = (double)totalBytesWritten / totalBytesExpectedToWrite;
112 }
113 @end
 
原文地址:https://www.cnblogs.com/oc-bowen/p/5176607.html