|
8 | 8 |
|
9 | 9 | #import "ViewController.h" |
10 | 10 |
|
11 | | -@interface ViewController () |
| 11 | +static NSString *const bigPic = @"http://i1.piimg.com/4851/d1498fea89ae3bc1.png"; |
| 12 | +static NSString *const smallPic = @"http://i1.piimg.com/4851/97aef4680d359905.png"; |
12 | 13 |
|
| 14 | +@interface ViewController ()<NSURLSessionDelegate> |
| 15 | +@property (weak, nonatomic) IBOutlet UIImageView *imageView; |
| 16 | +@property(nonatomic,strong)NSMutableData *data; |
13 | 17 | @end |
14 | 18 |
|
15 | 19 | @implementation ViewController |
16 | 20 |
|
17 | 21 | - (void)viewDidLoad { |
18 | 22 | [super viewDidLoad]; |
| 23 | + |
19 | 24 | // Do any additional setup after loading the view, typically from a nib. |
20 | 25 | } |
21 | 26 |
|
| 27 | +- (IBAction)requestDataTest:(id)sender { |
| 28 | + [self clear]; |
| 29 | + NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]]; |
| 30 | + NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:bigPic]]; |
| 31 | + NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request]; |
| 32 | + [dataTask resume]; |
| 33 | +} |
| 34 | + |
22 | 35 |
|
23 | | -- (void)didReceiveMemoryWarning { |
24 | | - [super didReceiveMemoryWarning]; |
25 | | - // Dispose of any resources that can be recreated. |
| 36 | +- (IBAction)requestDownloadTest:(id)sender { |
| 37 | + [self clear]; |
| 38 | + NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]]; |
| 39 | + NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:bigPic]]; |
| 40 | + NSURLSessionDownloadTask *dataTask = [session downloadTaskWithRequest:request]; |
| 41 | + [dataTask resume]; |
26 | 42 | } |
27 | 43 |
|
| 44 | +-(IBAction)requestBlockTaskTest:(id)sender{ |
| 45 | + [self clear]; |
| 46 | + NSURLSession *session = [NSURLSession sharedSession]; |
| 47 | + NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:bigPic]]; |
| 48 | + NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { |
| 49 | + UIImage *image = [[UIImage alloc]initWithData:data]; |
| 50 | + self.imageView.image = image; |
| 51 | + }]; |
| 52 | + [dataTask resume]; |
| 53 | +} |
| 54 | + |
| 55 | +-(void)clear{ |
| 56 | + self.imageView.image = nil; |
| 57 | +} |
| 58 | + |
| 59 | +//==============================NSURLSessionDelegate======================== |
| 60 | +#pragma NSURLSessionDelegate |
| 61 | +//当一个session遇到系统错误或者未检测到的错误的时候,就会调用这个方法。 |
| 62 | +- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(nullable NSError *)error{ |
| 63 | + |
| 64 | +} |
| 65 | +//当请求需要认证、或者https证书认证的时候,我们就需要在这个方法里面处理。 |
| 66 | +- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge |
| 67 | + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler{ |
| 68 | + |
| 69 | +} |
| 70 | +//如果应用进入后台、这个方法会被调用。我们在这里可以对session发起的请求做各种操作比如请求完成的回调等。 |
| 71 | +- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { |
28 | 72 |
|
| 73 | +} |
| 74 | + |
| 75 | +//==================================NSURLSessionTaskDelegate==================== |
| 76 | +#pragma NSURLSessionTaskDelegate |
| 77 | +/* |
| 78 | + 当请求重定向的时候调用这个方法。我们必须设置一个新的`NSURLRequest`对象传入completionHandler来重定向新的请求,但是当`session`是background模式的时候,这个方法不会被调用。 |
| 79 | + */ |
| 80 | +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task |
| 81 | +willPerformHTTPRedirection:(NSHTTPURLResponse *)response |
| 82 | + newRequest:(NSURLRequest *)request |
| 83 | + completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler{ |
| 84 | + |
| 85 | +} |
| 86 | +/* |
| 87 | + 当请求需要认证的时候调用这个方法。如果没有实现这个代理,那么请求认证这个过程不会被调用。 |
| 88 | + */ |
| 89 | +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task |
| 90 | +didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge |
| 91 | + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler{ |
| 92 | + |
| 93 | +} |
| 94 | +/* |
| 95 | + 如果请求需要一个新的请求体时,这个方法就会被调用。比如认证失败的时候,我们可以通过这个机会从新认证。 |
| 96 | + */ |
| 97 | +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task |
| 98 | + needNewBodyStream:(void (^)(NSInputStream * _Nullable bodyStream))completionHandler{ |
| 99 | + |
| 100 | +} |
| 101 | +/* |
| 102 | + 当我们上传数据的时候,我们可以通过这个代理方法获取上传进度。 |
| 103 | + */ |
| 104 | +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task |
| 105 | + didSendBodyData:(int64_t)bytesSent |
| 106 | + totalBytesSent:(int64_t)totalBytesSent |
| 107 | +totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend{ |
| 108 | + NSLog(@""); |
| 109 | +} |
| 110 | +/* |
| 111 | + 当task的统计信息收集好了以后,调用这个方法。 |
| 112 | + */ |
| 113 | +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics { |
| 114 | + |
| 115 | +} |
| 116 | +/* |
| 117 | + 当一个task出错的时候,会调用这个方法。如果error是nil,也会调用这个方法,表示task完成。 |
| 118 | + */ |
| 119 | +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task |
| 120 | +didCompleteWithError:(nullable NSError *)error{ |
| 121 | + NSLog(@"数据返回以后,不管有错没错都回调用,如果没错,error及时nil"); |
| 122 | + if (self.data) { |
| 123 | + self.imageView.image = [UIImage imageWithData:self.data]; |
| 124 | + self.data = nil; |
| 125 | + } |
| 126 | +} |
| 127 | + |
| 128 | +//==================================NSURLSessionDataDelegate===================================== |
| 129 | +#pragma NSURLSessionDataDelegate |
| 130 | +/* |
| 131 | + 当一个task接收到返回信息。当所有信息都接收完毕以后,completionHandler会被调用。我们可以在这里取消一个网络请求或者把一个datatask转换为downloadtask。如果没有实现这个代理方法,我们也可以通过task的response属性获取到对应的数据。background模式的uploadtask不会调用这个方法。 |
| 132 | + */ |
| 133 | +- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask |
| 134 | +didReceiveResponse:(NSURLResponse *)response |
| 135 | + completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler{ |
| 136 | + self.data = nil; |
| 137 | + self.data = [NSMutableData data]; |
| 138 | + // 允许处理服务器的响应,才会继续接收服务器返回的数据 |
| 139 | + completionHandler(NSURLSessionResponseAllow); |
| 140 | +} |
| 141 | +/* |
| 142 | + 当一个datatask转换为一个downloadtask以后会调用。 |
| 143 | + */ |
| 144 | +- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask |
| 145 | +didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask{ |
| 146 | + |
| 147 | +} |
| 148 | +/* |
| 149 | + 暂时忽略,这个是和数据流相关的。不管了 |
| 150 | + */ |
| 151 | +- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask |
| 152 | +didBecomeStreamTask:(NSURLSessionStreamTask *)streamTask{ |
| 153 | + |
| 154 | +} |
| 155 | +/* |
| 156 | + 当data可以使用的时候,调用这个方法。我们可以在这里获取data。 |
| 157 | + */ |
| 158 | +- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask |
| 159 | + didReceiveData:(NSData *)data{ |
| 160 | + [self.data appendData:data]; |
| 161 | + NSLog(@"具体数据在URLSession:(NSURLSession *)session task:(NSURLSessionTask *)taskdidCompleteWithError:(nullable NSError *)error处理"); |
| 162 | +} |
| 163 | +/* |
| 164 | + 允许我们在这里调用completionHandler缓存data,或者传入nil来禁止缓存 |
| 165 | + */ |
| 166 | +- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask |
| 167 | + willCacheResponse:(NSCachedURLResponse *)proposedResponse |
| 168 | + completionHandler:(void (^)(NSCachedURLResponse * _Nullable cachedResponse))completionHandler{ |
| 169 | + |
| 170 | +} |
| 171 | +//==================================NSURLSessionDownloadTask================================= |
| 172 | +#pragma NSURLSessionDownloadTask |
| 173 | +/* |
| 174 | + 当一个下载task任务完成以后,这个方法会被调用。我们可以在这里移动或者复制download的数据 |
| 175 | + */ |
| 176 | +- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask |
| 177 | +didFinishDownloadingToURL:(NSURL *)location{ |
| 178 | + NSString *path = location.absoluteString; |
| 179 | + UIImage *image = [[UIImage alloc]initWithData:[NSData dataWithContentsOfURL:location]]; |
| 180 | + self.imageView.image = image; |
| 181 | + NSLog(@"数据下载完成以后,会保存在一个location的地方。%@",location); |
| 182 | +} |
| 183 | +/* |
| 184 | + 获取下载进度 |
| 185 | + */ |
| 186 | +- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask |
| 187 | + didWriteData:(int64_t)bytesWritten |
| 188 | + totalBytesWritten:(int64_t)totalBytesWritten |
| 189 | +totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{ |
| 190 | + NSLog(@"总得数据大小%lld----",bytesWritten); |
| 191 | +} |
| 192 | +/* |
| 193 | + 重启一个下载任务(比如下载一半后停止然后过一点时间继续)。如果下载出错,`NSURLSessionDownloadTaskResumeData`里面包含重新开始下载的数据。 |
| 194 | + */ |
| 195 | +- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask |
| 196 | + didResumeAtOffset:(int64_t)fileOffset |
| 197 | +expectedTotalBytes:(int64_t)expectedTotalBytes{ |
| 198 | + |
| 199 | +} |
29 | 200 | @end |
0 commit comments