Demo_2 NSURLSession
NSURLSession的出世就意味着前面提到的NSURLConnection的灭亡,进化论规律,前辈都被拍死在沙滩上,说笑,下面进入正题
1. 所谓后来者居上,那也是继承了前辈的优点
>创建NSURLRequest必不可少
>紧接着创建NSURLSession对象: 这里创建对象用的是单例模式,单例模式的优点和作用就不在这单独讲解了,改天专门拿出来讲(嘻嘻,其实我也是水的很).
>这里比NSURLConnection多的就是要创建任务 ,
任务分为两种: NSURLSessionDownloadTask 下载任务
NSURLSessionDataTask 数据任务
两种区别在哪里呢?
1. 下载任务:执行时会返回一个临时文件放在沙盒的tmp文件中,当程序结束后就会被系统自动删除,所以 如果想要保存的话,就在删除之前将它移出来,方法见前面的Filemanager讲解的文件管理文章
2. 数据任务:下载时,下载的资源会被存在内存的data变量中
说完了区别,那么两者的共同点在哪里?
1.两者在下载完成之后的返回操作都是在分线程中完成,如果想要在这里面添加UI的现实,就必须使用GCD或者其他线程方法放回到主线程中(线程方法前面文章有介绍).
下面看一个Demo加深理解
//下载任务:图片下载到tmp文件中
- (IBAction)downloadImageByDownloadTask:(UIButton *)sender {
//添加网络标识
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
//1.创建NSURLRequest对象
NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://baike.soso.com/p/20090711/20090711101754-314944703.jpg"]];
//2.创建NSURLSession
NSURLSession *session=[NSURLSession sharedSession];
//3.创建下载任务对象
NSURLSessionDownloadTask *task=[session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//明确线程
NSLog(@"线程: %@",[NSThread currentThread]);
NSLog(@"本地储存位置%@",location);
NSLog(@"路径:%@",location.path);
//清楚回调的三个参数
//方案1 loaction-- >UIimage
UIImage *image=[UIImage imageWithData:[NSData dataWithContentsOfFile:location.path]];
//方案2: 马上移到Library/Caches
NSString*cacahesPath= NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
NSString *iamgePath=[cacahesPath stringByAppendingPathComponent:response.suggestedFilename ];
error=nil;
if(! [[NSFileManager defaultManager] moveItemAtPath:location.path toPath:iamgePath error:&error]){
NSLog(@"移动失败,原因:%@",error.userInfo);
}
//回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image=image;
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
});
}];
//4.执行下载任务
[task resume];
}
其中block 中返回的数据都是在下载结束后才得到的,出了block后就会被释放,所以关于文件数据的保存都在这里进行,其实看方法名就可以知道completionHandler
下面给出数据下载任务的部分Demo
- (IBAction)downloadImageByDataTask:(UIButton *)sender {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
//1.NSURLRequest
NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://pic1.nipic.com/2009-02-19/200921922311483_2.jpg"]];
//2.单例的方式
NSURLSession *session=[NSURLSession sharedSession];
//3.数据任务(资源存在内存的data变量中)
NSURLSessionDataTask *task=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//看看线程
NSLog(@"线程%@",[NSThread currentThread]);
//NSLog(@"data:%@",data);
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image=[UIImage imageWithData:data];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
});
}];;
//执行下载任务(异步执行)
[task resume];
NSLog(@"下载完毕");
}
如果需要完整版的Demo可以私信可我, 现在没有时间上传到GitHub,以后有时间了可能会添加链接