NSURLSession解决下载中的进度跟进问题——通过实现NSURLSessionDownloadDelegate协议中的回调方法
来源:互联网 发布:vnc viewer linux 编辑:程序博客网 时间:2024/06/06 05:11
使用NSURLSession解决下载中的进度跟踪问题,大致步骤如下:
第一步:网址转义。因为网址中如果有中文的话是不可以被服务器识别的。所以要对其进行转义。需要注意的是:下载一般都是GET请求 只有GET请求需要对网址进行转义,POST请求是不需要转义的。使用的转义方法如下:
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;
具体使用如下:NSString *urlStr =@"http://127.0.0.1/07-知识点勘误.mp4";
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURLURLWithString:urlStr];
第二步:实例化NSURLSession对象。要使用NSURSessionLConfiguration对象来初始化Session对象的方法参数。而对于NSURLSessionConfiguration 也是一个单例类 可以用来配置全局的网络访问参数。具体如下:2.1 新建单例Configuration对象
NSURLSessionConfiguration *session = [NSURLSessionConfiguration defaultSessionConfiguration];
2.2 使用Configuration对象来初始化NSURLSession的构造参数。
NSURLSession *session = [NSURLSession sessionWithConfiguration:configdelegate:selfdelegateQueue:[NSOperationQueuemainQueue]];
参数:delegateQueue:指定回调方法的执行的线程队列。需要注意的是:苹果已经对此方法进行了封装处理。如果直接传值为nil即默认情况下或传进一个并发操作队列即[[NSOperation alloc] init] ,那么执行代理回调方法的队列就是并发队列会由多个线程异步并发执行。但是如果指定为[NSOperation mainQueue],回调方法只会由主线程队列进行同步执行。
第三步:遵守NSURLSessionDownloadDelegate协议,并实现其回调方法。
此协议的回调方法一共有如下三个回调方法。
第一个方法:当下载完成后才会调用如下方法,IOS7和IOS8都必须实现此方法。
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
第二个方法:下载进度变化的时候会调用如下回调方法,IOS7必须实现,但IOS8可以选择不实现。
/**
bytesWritten: 本次写入的字节数
totalBytesWritten:已经写入的字节数(目前下载的字节数)
totalBytesExpectedToWrite:总得下载字节数(文件的总大小)
*/
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
第三个方法:断点续传的时候会调用如下方法,一般什么都不写。IOS7必须实现,IOS8可以选择不实现。-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)
必须注意的是:由Configuration初始化Session对象后。需要由Session发起并继续任务。因为所有的Session对象默认都是挂起的,必须调用一下resume方法才会开始执行。具体使用如下:
[[session downloadTaskWithURL:url]resume];
具体工程如下:<span style="font-size:18px;">//// ViewController.m// NSURLSession进行下载//// Created by apple on 15/10/30.// Copyright (c) 2015年 LiuXun. All rights reserved.//#import "ViewController.h"#import "SSZipArchive.h"@interface ViewController ()<NSURLSessionDownloadDelegate>@end@implementation ViewController-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ // 1 url NSString *urlStr = @"http://127.0.0.1/07-知识点勘误.mp4"; urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlStr]; // 实例化Session对象 // Configuration 可以配置全局的网络访问参数 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; // 指定回调方法执行的线程 /* 其实苹果已经对Session进行了封装,不管delegateQueue是否为全局队列还是nil。代理方法都会在子线程进行异步执行.但是当我们使用主队列时,代理方法只会在主线程执行 */ // NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[[NSOperationQueue alloc] init] ]; // NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; // 发起并继续任务 [[session downloadTaskWithURL:url] resume];}#pragma mark- NSURLSessionDownloadDelegate// 1、 下载完成后被调用的方法 IOS7&IOS8都必须实现的方法-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{ NSLog(@"下载完成");}// 2、 下载进度变化的时候被调用的。 IOS8可以不实现,但IOS7必须实现/** bytesWritten: 本次写入的字节数 totalBytesWritten:已经写入的字节数(目前下载的字节数) totalBytesExpectedToWrite:总得下载字节数(文件的总大小) */-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{ float progress =(float) totalBytesWritten/totalBytesExpectedToWrite; // NSLog(@"%f", progress); NSLog(@"======%@", [NSThread currentThread]);}// 3、断点续传的时候,被调用的方法。一般什么都不写,IOS8可以不实现,但IOS7必须实现-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{ }@end</span>运行结果如下:
只打印进度时,输出如下:
屏蔽打印进度的代码,当传值为并发操作队列时,打印如下:
当传值为nil时,打印执行代理方法的线程如下:
当传值为操作主线程时,打印执行代理方法的线程如下:
- NSURLSession解决下载中的进度跟进问题——通过实现NSURLSessionDownloadDelegate协议中的回调方法
- NSURLSession解决下载中的解压缩问题
- 使用NSURLConnection解决下载的问题——同步解决下载内存峰值与进度跟进的问题(只需了解原理)
- NSURLSession实现下载(不能看到下载进度)
- iOS - 大文件下载篇(NSURLSessionDownloadDelegate 协议)
- 网络:NSURLSession 下载进度
- NSURLSession下载的进度监测
- libcurl 通过http协议下载文件并显示下载进度
- NSURLSession下载文件—断点续传
- NSURLSession下载文件—断点续传
- ios断点续传:通过NSURLSession实现文件下载功能
- 解决Retrofit文件下载进度显示问题
- 解决Retrofit文件下载进度显示问题
- 解决Retrofit文件下载进度显示问题
- 通过快速跟进与赶工追回项目进度
- Mac Appium 问题—持续跟进
- NSURLSession下载问题
- NSURLSession实现下载(代理)
- 牛逼的架构 vs ‘牛逼’ 的人生
- 04-树4 是否同一棵二叉搜索树
- Node模块详解
- 搭建php环境时解决jpeg6 make: ./libtool:命令未找到
- 第九周-项目3-稀疏矩阵的三元组表示的实现及应用
- NSURLSession解决下载中的进度跟进问题——通过实现NSURLSessionDownloadDelegate协议中的回调方法
- 通过Class,Method来认识泛型的本质
- html本地存储对像以及模板juicer插件的使用
- 欢迎使用CSDN-markdown编辑器
- iOS软键盘遮挡UITableView内文本框问题
- POJ_2769同余问题
- 数据库in和exist的区别
- Readme.txt
- Android xml资源文件中@、@android:type、@*、?、@+含义和区别