iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法
一、NSURLSession、NSURLSessionTask的使用步骤
- 首先创建NSURLSession对象
- 通过NSURLSession对象创建对应的任务

<1>NSURLSessionDataTask的GET和POST -- 以及url中包含了中文的解决办法


<2>NSURLSessionDownloadTask实现小文件的下载

<3>NSURLSessionDownloadTask实现大文件的断点下载 -- 暂时没有实现退出程序后的文件续传
#import "ViewController.h"
// 最好是用到哪个任务就实现哪种任务类型的代理协议
@interface ViewController () <NSURLSessionDownloadDelegate>
@property (weak, nonatomic) IBOutlet UIProgressView *progressBar;
@property (weak, nonatomic) IBOutlet UILabel *precentLabel; /** task */
@property(nonatomic,strong) NSURLSessionDownloadTask *task; /** resumeData */
@property(nonatomic,strong) NSData *resumeData; /** session */
@property(nonatomic,strong) NSURLSession *session; @end @implementation ViewController - (NSURLSession *)session
{
if (_session == nil) {
// 通过设置NSURLSession的Configuration来指定session的代理,以及代理的线程
_session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
}
return _session;
} - (IBAction)start:(id)sender { NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_15.mp4"]];
// 只通过request创建task 文件的具体下载通过代理来实现,
self.task = [self.session downloadTaskWithRequest:request]; [self.task resume]; }
- (IBAction)pause:(id)sender {
// 取消任务 并产生一个恢复数据 -- 任务一旦取消就不能恢复
[self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
// 将恢复数据存入变量
self.resumeData = resumeData;
}]; }
- (IBAction)goOn:(id)sender { // 任务已经被取消了,只能重新开启任务,通过resumeData继续下载任务
self.task = [self.session downloadTaskWithResumeData:self.resumeData]; // 恢复任务
[self.task resume];
} - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { } #pragma mark - <NSURLSessionDownloadDelegate> - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
// bytesWritten -- 本次写入的长度
// totalBytesWritten -- 目前共写入的长度
// totalBytesExpectedToWrite -- 期望的长度,也就是总长度 // 在主线程中修改UI界面
[[NSOperationQueue mainQueue]addOperationWithBlock:^{ self.progressBar.progress = 1.0 * totalBytesWritten / totalBytesExpectedToWrite; self.precentLabel.text = [NSString stringWithFormat:@"%0.1f%%",self.progressBar.progress * ]; }]; NSLog(@"%zd / %zd",totalBytesWritten,totalBytesExpectedToWrite);
} // 完成下载的时候调用,系统默认将下载的文件存放到了沙盒的temp文件中
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
// 剪切文件到Caches
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename]; NSFileManager *mgr = [NSFileManager defaultManager]; [mgr moveItemAtURL:location toURL:[NSURL fileURLWithPath:filePath] error:nil]; NSLog(@"didFinishDownloadingToURL");
}
// 任务完成的时候调用
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"didCompleteWithError");
} @end
简单的界面:

iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法的更多相关文章
- iOS边练边学--transform的简单介绍并且用transform实现键盘处理
一.transform:形变属性,能完成功能:平移,缩放,旋转 <平移> // 根据给的移动距离平移 self.tempView.transform = CGAffineTransform ...
- iOS边练边学--Http网络再学习,简单介绍
一.URL 什么是URL URL中常见的协议 二.Http Http的基本通信过程 发送Http请求的方法 GET 和 POST 对比 GET 和 POST 的选择 三.iOS中的Http学习 iOS ...
- iOS边练边学--NSURLSessionDataTask实现文件真正的断点续传
实现重点: NSURLSessionDataTask要设置请求头,从路径中获取文件已经下载的长度(文件没有下载过的话,长度为0).通过这个长度设置请求的Range 如图: 接收到请求的时候key:文件 ...
- iOS边练边学--AFNetWorking框架GET、Post、Download、Upload,数据解析模式以及监控联网状态
一.AFNETWorking简单使用 get请求 get请求,以后经常用NSURLSession底层的写的部分 简单的post请求 用post请求下载文件,方法很多,还可以通过upload任务来执行 ...
- iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信
一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...
- iOS边练边学--CALayer,非根层隐式动画,钟表练习
一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性 ...
- iOS边练边学--UIGestureRecognizer手势识别器简单介绍
iOS 3.2之后,苹果退出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度. 一.UIGestureRecognizer UIGestureRe ...
- iOS边练边学--触摸事件以及能够拖拽的UIView的练习
一.用户在使用APP的过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型: 二.响应者对象 在iOS中只有继承了了UIResponder的对象才能接受并处理事件,这样的对象称之为“响应者对象 ...
- iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种
iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core D ...
随机推荐
- 如何在nopcommerce3.3注册页面添加密码强度检查仪?
我刚刚完成了nopCommerce注册页面的密码强度检查仪,因为我觉得在电子商务交易平台,安全问题是非常重要的.在注册页面有必要添加一个密码强度检测仪,以便通知用户他们的密码是否足够强大.今天,大多数 ...
- Android View坐标getLeft, getRight, getTop, getBottom
1 引起疑惑 分析视图invalidate流程的过程中发现view的left, right, top, bottom跟自己理解的不一样,现在想分析一下这几个值具体的含义. 2 理解坐标,位置概念 ...
- 一些MEL命令
这几天写maya脚本,发现一些新命令: 动画命令 cutKey 剪切某段动画曲线 simplify 简化某段曲线 基本命令 getAttr -size 数组属性名 获得数组属性的元素个数 ...
- ES6新增const常量、let变量
JavaScript 严格模式(use strict) 严格模式下你不能使用未声明的变量. const c1 = 1; const c2 = {}; const c3 = []; 不能对c1的值进行再 ...
- C语言 野指针与空指针
//野指针与空指针的区别 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //野指针是 ...
- C#不同窗体间通信,数据传递
在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后 ...
- EasyUI Tree判断节点是否是叶
方法1: $('#domaincatalog').tree('isLeaf', node.target); 返回true或false ,true表示是叶节点, false即不是 方法2:官方文档中: ...
- JS 之DOM对象(1)
介绍DOM1中底层的一些属性和方法. 节点操作 appendChild() parentNode.appendChild(newNode) 在parentNode节点的最后插入newNode ins ...
- vbs test
'-----------------------------------Class clsGetProfilePrivate rootDocPublic Sub setProfile(strFileN ...
- 分页-pagination
需先引入jQuery,再引入pagination组件 <script src="jquery.js"></script> <script src=&q ...