一、NSURLSession、NSURLSessionTask的使用步骤

  • 首先创建NSURLSession对象
  • 通过NSURLSession对象创建对应的任务

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

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

  <3>NSURLSessionDownloadTask实现大文件的断点下载 -- 暂时没有实现退出程序后的文件续传

  1. #import "ViewController.h"
  2. // 最好是用到哪个任务就实现哪种任务类型的代理协议
  3. @interface ViewController () <NSURLSessionDownloadDelegate>
  4. @property (weak, nonatomic) IBOutlet UIProgressView *progressBar;
  5. @property (weak, nonatomic) IBOutlet UILabel *precentLabel;
  6.  
  7. /** task */
  8. @property(nonatomic,strong) NSURLSessionDownloadTask *task;
  9.  
  10. /** resumeData */
  11. @property(nonatomic,strong) NSData *resumeData;
  12.  
  13. /** session */
  14. @property(nonatomic,strong) NSURLSession *session;
  15.  
  16. @end
  17.  
  18. @implementation ViewController
  19.  
  20. - (NSURLSession *)session
  21. {
  22. if (_session == nil) {
  23. // 通过设置NSURLSession的Configuration来指定session的代理,以及代理的线程
  24. _session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
  25. }
  26. return _session;
  27. }
  28.  
  29. - (IBAction)start:(id)sender {
  30.  
  31. NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_15.mp4"]];
  32. // 只通过request创建task 文件的具体下载通过代理来实现,
  33. self.task = [self.session downloadTaskWithRequest:request];
  34.  
  35. [self.task resume];
  36.  
  37. }
  38. - (IBAction)pause:(id)sender {
  39. // 取消任务 并产生一个恢复数据 -- 任务一旦取消就不能恢复
  40. [self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
  41. // 将恢复数据存入变量
  42. self.resumeData = resumeData;
  43. }];
  44.  
  45. }
  46. - (IBAction)goOn:(id)sender {
  47.  
  48. // 任务已经被取消了,只能重新开启任务,通过resumeData继续下载任务
  49. self.task = [self.session downloadTaskWithResumeData:self.resumeData];
  50.  
  51. // 恢复任务
  52. [self.task resume];
  53. }
  54.  
  55. - (void)viewDidLoad {
  56. [super viewDidLoad];
  57. // Do any additional setup after loading the view, typically from a nib.
  58. }
  59.  
  60. - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
  61.  
  62. }
  63.  
  64. #pragma mark - <NSURLSessionDownloadDelegate>
  65.  
  66. - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
  67. {
  68. // bytesWritten -- 本次写入的长度
  69. // totalBytesWritten -- 目前共写入的长度
  70. // totalBytesExpectedToWrite -- 期望的长度,也就是总长度
  71.  
  72. // 在主线程中修改UI界面
  73. [[NSOperationQueue mainQueue]addOperationWithBlock:^{
  74.  
  75. self.progressBar.progress = 1.0 * totalBytesWritten / totalBytesExpectedToWrite;
  76.  
  77. self.precentLabel.text = [NSString stringWithFormat:@"%0.1f%%",self.progressBar.progress * ];
  78.  
  79. }];
  80.  
  81. NSLog(@"%zd / %zd",totalBytesWritten,totalBytesExpectedToWrite);
  82. }
  83.  
  84. // 完成下载的时候调用,系统默认将下载的文件存放到了沙盒的temp文件中
  85. - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
  86. {
  87. // 剪切文件到Caches
  88. NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
  89.  
  90. NSFileManager *mgr = [NSFileManager defaultManager];
  91.  
  92. [mgr moveItemAtURL:location toURL:[NSURL fileURLWithPath:filePath] error:nil];
  93.  
  94. NSLog(@"didFinishDownloadingToURL");
  95. }
  96. // 任务完成的时候调用
  97. - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
  98. {
  99. NSLog(@"didCompleteWithError");
  100. }
  101.  
  102. @end

简单的界面:

iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法的更多相关文章

  1. iOS边练边学--transform的简单介绍并且用transform实现键盘处理

    一.transform:形变属性,能完成功能:平移,缩放,旋转 <平移> // 根据给的移动距离平移 self.tempView.transform = CGAffineTransform ...

  2. iOS边练边学--Http网络再学习,简单介绍

    一.URL 什么是URL URL中常见的协议 二.Http Http的基本通信过程 发送Http请求的方法 GET 和 POST 对比 GET 和 POST 的选择 三.iOS中的Http学习 iOS ...

  3. iOS边练边学--NSURLSessionDataTask实现文件真正的断点续传

    实现重点: NSURLSessionDataTask要设置请求头,从路径中获取文件已经下载的长度(文件没有下载过的话,长度为0).通过这个长度设置请求的Range 如图: 接收到请求的时候key:文件 ...

  4. iOS边练边学--AFNetWorking框架GET、Post、Download、Upload,数据解析模式以及监控联网状态

    一.AFNETWorking简单使用 get请求 get请求,以后经常用NSURLSession底层的写的部分 简单的post请求 用post请求下载文件,方法很多,还可以通过upload任务来执行 ...

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

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

  6. iOS边练边学--CALayer,非根层隐式动画,钟表练习

    一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性 ...

  7. iOS边练边学--UIGestureRecognizer手势识别器简单介绍

    iOS 3.2之后,苹果退出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度. 一.UIGestureRecognizer UIGestureRe ...

  8. iOS边练边学--触摸事件以及能够拖拽的UIView的练习

    一.用户在使用APP的过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型: 二.响应者对象 在iOS中只有继承了了UIResponder的对象才能接受并处理事件,这样的对象称之为“响应者对象 ...

  9. iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种

    iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core D ...

随机推荐

  1. 去哪儿网2017校招在线笔试(前端工程师)编程题及JavaScript代码

    编程题很简单.整个试卷结构为: 一.问答题: 对前端的理解,了解哪些框架库? 二.在线编程题:身份证分组 如下第一道:身份证分组 三.在线编程题:身份证分组.统计字符.酒店价格(三选二) 如下第二三四 ...

  2. 【读书笔记《Android游戏编程之从零开始》】11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView 的区别)

    1. SurfaceView 游戏框架实例 实例效果:就是屏幕上的文本跟着点击的地方移动,效果图如下: 步骤: 新建项目“GameSurfaceView”,首先自定义一个类"MySurfac ...

  3. Normalize.css的使用(重置表)

    本文译自Normalize.css官网: http://nicolasgallagher.com/about-normalize-css/ Normalize.css 只是一个很小的CSS文件,但它在 ...

  4. android调试模拟器启动太慢,怎样才能更快的调试程序呢?

    答: 1. 模拟器不关,直接按调试按钮系统会自动重新安装软件的.

  5. AutoIT 实现Firefox上传文件

    Firefox浏览器文件上传代码如下: ;upload file Func _UploadFile($file) AutoItSetOption("WinTitleMatchMode&quo ...

  6. McCall的软件质量模型

    McCall等认为,特性是软件质量的反映,软件属性可用做评价准则,定量化地度量软件属性可知软件质量的优劣 McCall认为软件的质量模型应该包括 产品的修正.产品的转移,产品的运行 而产品的修正又包括 ...

  7. 【java基础】 如何导入外部jar包

    转:from http://www.zhihu.com/question/20311561 有两种常用的方法. 1. 以外部包(External Archives)的形式导入. 在默认位于 Eclip ...

  8. App_api设计

    2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站那样所取代,不但如此,越来越多的传统应用.网站也都开始制作自己的移动APP,也就是我们常说的IOS客户端.android客户端.这 ...

  9. StartUML 破解

    各平台版本均适用,本文更改的为Mac版本.​ 1,打开对应 mac版本的安装包位置,在对应目录/Applications/StarUML.app/Contents/www/license/node/L ...

  10. Summary Ranges

    Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...