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
NSURLSessionConfiguration的简单实用的更多相关文章
- jQuery的几种简单实用效果
许久未分享博客,或许已生疏. 闲来无事, 分享几个jQuery简单实用的效果案例 不喜勿喷... 1.页面常用的返回顶部 <!DOCTYPE html> <html lang=&qu ...
- 经验分享:10个简单实用的 jQuery 代码片段
尽管各种 JavaScirpt 框架和库层出不穷,jQuery 仍然是 Web 前端开发中最常用的工具库.今天,向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段. 您可能感兴趣的相 ...
- 简单实用的PHP防注入类实例
这篇文章主要介绍了简单实用的PHP防注入类实例,以两个简单的防注入类为例介绍了PHP防注入的原理与技巧,对网站安全建设来说非常具有实用价值,需要的朋友可以参考下 本文实例讲述了简单实用的PHP防注 ...
- php简单实用的操作文件工具类(创建、移动、复制、删除)
php简单实用好用的文件及文件夹复制函数和工具类(创建.移动.复制.删除) function recurse_copy($src,$dst) { // 原目录,复制到的目录 $dir = opend ...
- 基于Bootstrap简单实用的tags标签插件
http://www.htmleaf.com/jQuery/ jQuery之家 自由分享jQuery.html5和css3的插件库 基于Bootstrap简单实用的tags标签插件
- C#_简单实用的翻页
简单实用的生成翻页HTML辅助类 C# using System.Text; namespace ClassLibrary { /// <summary> /// /// </sum ...
- 简单实用的Windows命令(一)
前几天新买了一台笔记本电脑,使用了一下几个简单的查看电脑配置的命令,觉得非常的不错,在此记录一下 一:运行命令的方式有两种 1:使用快捷键WIN+R,然后在弹出的“运行”对话框中输入对应的命令 2:在 ...
- 简单实用的Windows命令(二)
昨天简单的记录了几个非常简单实用的Windows命令,不过我又想起来还有两个我在实际的工作中也是经常用到的命令——PING和IPCONFIG,不过我在工作中的使用都是非常简单的,用PING命令检测对应 ...
- iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信
一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...
随机推荐
- 动画原理——绘制正弦函数&环绕运动&椭圆运动
书籍名称:HTML5-Animation-with-JavaScript 书籍源码:https://github.com/lamberta/html5-animation 1.正弦函数.x位置递增, ...
- 使用SQL脚本删除冗余的视图和表
使用SQL脚本删除冗余的视图和表 SQL脚本删除视图信息 USE DatabaseGOIF OBJECT_ID('ViewName')IS NOT NULLBEGINDROP VIEW ViewNam ...
- 在 IIS 中配置 ASP.NET 应用程序
注意事项: 1.注册.NET 如果先安装.net平台,后安装IIS,那么在IIS中可能就没有出现ASP.NET版本的下拉菜单,就要手动注册: 一般.Net版本都存放在:C:\WINDOWS\Micr ...
- vue分页组件table-pagebar
之前一直接触都是原始的前端模型,jquery+bootstrap,冗杂的dom操作,繁琐的更新绑定.接触vue后,对前端MVVM框架有了全新的认识.本文是基于webpack+vue构建,由于之前的工作 ...
- Extjs springmvc session 超时 处理
如果你的项目使用ExtJS作为表现层,你会发现,SESSION超时控制将是一个问题.本文将就自己的经验,来解决这一问题,当然,解决问题并非只有一种方法,我只是提出我的方法.首先,做超时控制,必需使用过 ...
- 新学习的Python的代码(while循环)
直接上代码: # while.py number = 23 isRun = True while isRun: intt = int(raw_input('请输入一个整数 : ')) if intt ...
- html5的自定义data-*属性与jquery的data()方法的使用
人们总喜欢往HTML标签上添加自定义属性来存储和操作数据.但这样做的问题是,你不知道将来会不会有其它脚本把你的自定义属性给重置掉,此外,你这样做也会导致html语法上不符合Html规范,以及一些其它副 ...
- Ajax中XML和JSON格式的优劣比较
刚做完一个小的使用Ajax的项目.整个小项目使用JavaScript做客户端,使用PHP做服务器端.利用xmlHttpRequest组件作为交互工具,利用XML作为数据传输的格式.做完后基本做一个简单 ...
- Linux下安装QT和OpenGL后QT无法使用OpenGL的解决方法
我的系统为Ubuntu14.04,用apt-get安装了实现了OpenGl的mesa,QT则是用官网下载的run文件来安装的. 好了,现在两个都分别有了,所以要在qt下尝试写OpenGl代码. 之前试 ...
- SQL Server 查看对象的权限
例子 1. 查看登录名 loginA的权限: create login loginA with password = '123456'; go use studio; create user logi ...