NSURLSessionConfiguration

基于前面学习了NSURLSession的知识,这边文章就讲下NSURLSessionConfiguration相关应用,(这名字可真长).

简而言之,NSURlSessionConfiguration就是一个代理,是为了监控下载过程的.

那么问题来了,为什么需要这样一个代理呢,其实就是为了是实现断续下载和进度的监控,(个人理解,大神求指点).前面我提到了用NSURLSession创建的Task任务,只能在任务结束的completionHandler的block中获取到结束后的数据,想要使用这些数据的话也需要等到下载完成了,才能拿来使用,至于下载的过程中,想要使用数据不可能,为啥呢,没这方法啊.

下面讲一下简单的步骤:

  1. 创建NSURLRequest对象
  2. 创建NSURLsessionConfiguration对象
  3. 创建NSURLSession对象
  4. 数据任务/下载任务
  5. 执行

准备任务:

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的简单实用的更多相关文章

  1. jQuery的几种简单实用效果

    许久未分享博客,或许已生疏. 闲来无事, 分享几个jQuery简单实用的效果案例 不喜勿喷... 1.页面常用的返回顶部 <!DOCTYPE html> <html lang=&qu ...

  2. 经验分享:10个简单实用的 jQuery 代码片段

    尽管各种 JavaScirpt 框架和库层出不穷,jQuery 仍然是 Web 前端开发中最常用的工具库.今天,向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段. 您可能感兴趣的相 ...

  3. 简单实用的PHP防注入类实例

    这篇文章主要介绍了简单实用的PHP防注入类实例,以两个简单的防注入类为例介绍了PHP防注入的原理与技巧,对网站安全建设来说非常具有实用价值,需要的朋友可以参考下   本文实例讲述了简单实用的PHP防注 ...

  4. php简单实用的操作文件工具类(创建、移动、复制、删除)

    php简单实用好用的文件及文件夹复制函数和工具类(创建.移动.复制.删除) function recurse_copy($src,$dst) {  // 原目录,复制到的目录 $dir = opend ...

  5. 基于Bootstrap简单实用的tags标签插件

    http://www.htmleaf.com/jQuery/ jQuery之家 自由分享jQuery.html5和css3的插件库 基于Bootstrap简单实用的tags标签插件

  6. C#_简单实用的翻页

    简单实用的生成翻页HTML辅助类 C# using System.Text; namespace ClassLibrary { /// <summary> /// /// </sum ...

  7. 简单实用的Windows命令(一)

    前几天新买了一台笔记本电脑,使用了一下几个简单的查看电脑配置的命令,觉得非常的不错,在此记录一下 一:运行命令的方式有两种 1:使用快捷键WIN+R,然后在弹出的“运行”对话框中输入对应的命令 2:在 ...

  8. 简单实用的Windows命令(二)

    昨天简单的记录了几个非常简单实用的Windows命令,不过我又想起来还有两个我在实际的工作中也是经常用到的命令——PING和IPCONFIG,不过我在工作中的使用都是非常简单的,用PING命令检测对应 ...

  9. iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

    一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...

随机推荐

  1. 向未声明的 JavaScript 变量来分配值

    如果您把值赋给尚未声明的变量,该变量将被自动作为全局变量声明. 这条语句: carname="Volvo"; 将声明一个全局变量 carname,即使它在函数内执行.

  2. deal with 'non-admin area' warn

    We usually use the follow code to delete product in Magento $product = Mage::getSingleton('catalog/p ...

  3. ios常用的框架(源自知乎上的回答)

    首先,学习这类开源项目的主要目的是为了实现产品汪需求,如果不是这个目的,完全可以看Explore GitHub,当前最火的开源项目都在这里,当然你需要过滤一下语言. 好了,介绍几个希望能帮助到你. 普 ...

  4. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  5. EassyMock实践 捕获参数

    在测试接口过程中,有时我们希望知道自己期望传入的参数是什么,以此来判断传入参数的正确行,这时就需要用到EassyMock的capture方法.该方法能捕获传入的参数存放到自定义的变量中,然后用捕获的参 ...

  6. CFILE追加写入文件

    CFile file; file.Open(strName, CFile::modeWrite|CFile::modeNoTruncate|CFile::modeCreate); ) { file.S ...

  7. GO语言搭建

    最近对GO语言产生了浓厚的兴趣.因为GO语言不仅仅可以开发桌面.web程序,最吸引我的是安卓大有往GO语言全方位靠拢的趋势,自家的系统还是用自家的语言开发比较靠谱. 用一句话来说:Go语言是谷歌200 ...

  8. Robot Framework中DatabaseLibrary应用

    DatabaseLibrary: 在RF的官网上,有DatabaseLibrary的下载链接,DatabaseLibrary有2个版本,Python和Java版.本人使用的是Python版本. 1.下 ...

  9. Linux下diff使用简介

    diff用来比较两个文件的差异.首先构建两个相似的文件. Hello文件 world文件 使用diff -u  hello world > diff.txt,将两个文件的比对结果输入到diff. ...

  10. Linux彩色输出

    在linux下,可以使用一些宏,加上自定义格式输出,让输出更易于调试: 排版出来可能有些乱,注意do{ }while(0);是在一行里就可以了. #include <stdio.h> #i ...