NSURLSessionConfiguration的简单实用
NSURLSessionConfiguration
基于前面学习了NSURLSession的知识,这边文章就讲下NSURLSessionConfiguration相关应用,(这名字可真长).
简而言之,NSURlSessionConfiguration就是一个代理,是为了监控下载过程的.
那么问题来了,为什么需要这样一个代理呢,其实就是为了是实现断续下载和进度的监控,(个人理解,大神求指点).前面我提到了用NSURLSession创建的Task任务,只能在任务结束的completionHandler的block中获取到结束后的数据,想要使用这些数据的话也需要等到下载完成了,才能拿来使用,至于下载的过程中,想要使用数据不可能,为啥呢,没这方法啊.
下面讲一下简单的步骤:
- 创建NSURLRequest对象
- 创建NSURLsessionConfiguration对象
- 创建NSURLSession对象
- 数据任务/下载任务
- 执行
准备任务:
1.遵守协议<NSURLSessionDataDelegate>
2.实现方法: (两个方法都是在子线程中 进行的 可以打印[NSThread currentThread])
>监听下载的进度 其中的dataTask是NSURLSessionDataTask类型的变量,我们可以切进去看一下这个类的属性,其中有两个属性使我们下面的Demo要用到的
countOfBytesExpectedToSend 直译:期望收到的数据,也是就是要下载的任务的总大小
countOfBytesReceived 已经接受的大小
>变量data 是每一次下载的数据(这里可以称之为数据段) 因为这个方法在下载的过程中会被多次调用,所以每一次的data的大小都不确定 我们可以根据它的length属性查看大小
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data ;
下面的方法是下载结束后才执行的,如果发生错误可以输出error查看
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
简单的Demo
#import "ViewController.h"
@interface ViewController ()<NSURLSessionDataDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
//存储下载图片数据
@property (nonatomic, strong) NSMutableData *data;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//初始化可变数据data
self.data = [NSMutableData data];
}
- (IBAction)startDownloadImage:(id)sender {
//1.NSURLRequest
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://images.apple.com/v/iphone-5s/gallery/a/images/download/photo_1.jpg"]];
//2.configuration对象
/*default: 缓存的文件存到磁盘中(一般)
ephemeral: 缓存的文件存到内存
background:启动后台线程执行task
*/
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
//3.创建session对象
/*delegateQueue:nil -> 非主队列(子线程)
*/
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
//4.数据任务
NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
//5.执行
[task resume];
}
#pragma mark - DataDelegate
//监听下载进度
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
//子线程
// NSLog(@"%s", __func__);
//将服务器每次返回的data存到self.data中
[self.data appendData:data];
NSLog(@"每次返回的数据长度:%lu", (unsigned long)data.length);
//更新控件(progressView; imageView)
dispatch_async(dispatch_get_main_queue(), ^{
//已经下载数据的大小/图片的总大小
self.progressView.progress = dataTask.countOfBytesReceived * 1.0 / dataTask.countOfBytesExpectedToReceive;
//更新imageView
self.imageView.image = [UIImage imageWithData:self.data];
});
}
//监听下载完毕
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
NSLog(@"%s", __func__);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
最新文章
- js字符拼接
- windows自带的压缩,解压缩命令
- [汇编] 将字符串里的一个&#39;&;&#39;字符换成空格
- JDE函数--获取当前登录人的描述
- 最简单好用的SSO - 能经得起几万并发用户的SSO 组件使用方法介绍
- TPS和QPS的区别
- WPF编程学习——动画
- hql中的in查询
- 【机器学习笔记之四】Adaboost 算法
- Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解
- maven库
- AngularJS进阶(四)ANGULAR.JS实现下拉菜单单选
- ASP.NET Core 2.1 : 十四.静态文件与访问授权、防盗链
- Tsinghua 2018 DSA PA2简要题解
- autotools源文件相同/不同目录下
- 网络IP地址
- scala基本语法和单词统计
- 【APUE | 7】命令形参、函数
- win10自带虚拟机Hyper V联网
- eclipse web项目没有run on server