简介

NSURLSession是苹果官方提供的一系列网络接口库,使用他们可以轻松实现下载和数据获取等任务。在上一篇文章中,我们介绍了使用NSURLConnection下载文件和断点续传的功能,实现起来比较麻烦,对于文件的操作也比较繁琐,如果使用NSURLSession,这一切都将变得极为容易。

用法

  • 数据请求

    1.获取URLSession单例对象,并利用该对象创建一个dataTask,使用结构体回调。

    这段代码从网站上抓取JSON数组,解析为OC字典。

    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"http://www.soulghost.com/randompk/storeTest/baseRandom.php?type=attack"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
    NSLog(@"%@",dict);
    }];

    2.开启任务

    所有任务在创建时都是暂停的,应该手动启动。

    [task resume];
  • 小文件下载

    1.获取URLSession单例对象,创建一个downloadTask。

    • 注意此任务默认将文件下载到tmp文件夹,并且在下载结束后如果不处理会秒删,一般的做法是把它移动到Document或者Caches中,当下载结束后会调用结构体,在结构体里处理文件即可。
    • 通过NSFileManager可以实现文件的复制、移动操作,回调的location是tmp中刚刚下载的文件的URL。

      NSURLSession *session = [NSURLSession sharedSession];
      NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://127.0.0.1/lesson1/nav.dmg"] completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
      // 临时下载到tmp,必须及时处理,否则会被系统秒删。
      // 应该将临时文件移动到Caches文件夹
      NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
      // 可以使用建议的文件名,与服务端一致
      NSString *file = [path stringByAppendingPathComponent:response.suggestedFilename];
      // 移动文件
      NSFileManager *mgr = [NSFileManager defaultManager];
      [mgr moveItemAtPath:location.path toPath:file error:nil];
      }];

      2.开启任务

      所有任务在创建时都是暂停的,应该手动启动。

      [task resume];
  • 大文件下载

    大文件常常需要获取进度,这就需要设置代理,而不是用block回调。

    1.遵循代理方法,创建两个成员,一个用于指向下载任务对象,另一个用于保存断点数据。

    @interface ViewController () <NSURLSessionDownloadDelegate>
    @property (nonatomic, strong) NSURLSessionDownloadTask *task;
    @property (nonatomic, strong) NSData *resumeData;
    @end

    2.获取URLSession单例,创建下载任务,注意使用的方法与前面不同。

    • 不要忘了保存task。
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://127.0.0.1/lesson1/nav.dmg"] ];
    [task resume];
    _task = task;

    3.下载过程中会调用下面的代理方法,指示此次下载的字节数,一共下载的字节数与总字节数。

    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
    NSLog(@"写入量:%lld 下载进度:%f",bytesWritten,(double)totalBytesWritten/totalBytesExpectedToWrite);
    }

    4.下载结束后回调用下面的代理方法,从中同样要移动文件,只是如果要想拿到响应体response的suggestedFilename,需要通过downloadTask。

    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    // 可以使用建议的文件名,与服务端一致
    NSString *file = [path stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
    // 移动文件
    NSFileManager *mgr = [NSFileManager defaultManager];
    [mgr moveItemAtPath:location.path toPath:file error:nil]; [self.btn setTitle:@"Start" forState:UIControlStateNormal];
    }

    5.如果要暂停下载,调用下面的方法,通过回调结构体拿到断点数据,保存在我们之前创建的成员中以便恢复。

    • 注意用weakSelf避免循环引用。
    • 任务结束后就无效了,应该让指针指向nil来释放内存。
    __weak typeof(self) weakSelf = self;
    [self.task cancelByProducingResumeData:^(NSData *resumeData) {
    // resumeData内部包含了下次继续下载的开始位置
    weakSelf.resumeData = resumeData;
    weakSelf.task = nil;
    }];

    6.要恢复下载数据很容易,只需要通过断点创建任务即可。

    • 注意清空resumeData。
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    // 传入上次暂停下载返回的数据
    NSURLSessionDownloadTask *task = [session downloadTaskWithResumeData:self.resumeData];
    [task resume];
    _task = task;
    _resumeData = nil;
  • 断点续传开始时会调用下面的代理方法说明文件信息。

    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{
    }

(一二七)NSURLSession的基本用法 下载与数据获取的更多相关文章

  1. iOS7 中的新加入的下载类NSURLSession(随ios版本更新而更新)

    想详细的了解网络下载的相关知识,要仔细阅读URL Loading System Programming Guide 这里有篇好文章(http://www.shinobicontrols.com/blo ...

  2. IOS-网络(NSURLSession)

    一.NSURLSession的基本用法 // // ViewController.m // NSURLSession // // Created by ma c on 16/2/1. // Copyr ...

  3. 基于iOS 10、realm封装的下载器

    代码地址如下:http://www.demodashi.com/demo/11653.html 概要 在决定自己封装一个下载器前,我本以为没有那么复杂,可在实际开发过程中困难重重,再加上iOS10和X ...

  4. 2016 - 1 - 24 NSURLSession (一)

    一: NSURLSession简介 1.实施步骤 1.1 使用 NSURLSession对象 创建TASK ,然后执行TASK 2.TASK的类型: 二: NSURLSession的简单使用: - ( ...

  5. NSURLSession学习笔记

    NSURLSession学习笔记(一)简介 一.URL Session的基本概念 1.三种工作模式: 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁 ...

  6. NSURLSession的使用

    虽然在iOS7引入NSURLSession时,就知道NSURLConnection会最终被苹果放弃,但人总是喜欢做熟悉的事情,在NSURLConnection还可以使用时,就懒得学习这新玩意了,而且本 ...

  7. 使用bitsadmin.exe 下载文件,配合bcn.bat玩出更多的花样~~

    bitsadmin的简单介绍与基本用法: bitsadmin.exe 可以用来在windows 命令行下下载文件.bitsadmin是windows 后台智能传输服务的一个工具,windows 的自动 ...

  8. NSURLSession学习笔记(三)Download Task

    NSURLSession的Download Task用于完成下载任务,本文介绍如何创建断点续传的下载任务和后台下载任务. 我们直接从分析Demo入手: 故事板如下: 只有一个View Controll ...

  9. iOS学习笔记13-网络(二)NSURLSession

    在2013年WWDC上苹果揭开了NSURLSession的面纱,将它作为NSURLConnection的继任者.现在使用最广泛的第三方网络框架:AFNetworking.SDWebImage等等都使用 ...

随机推荐

  1. codeforces 868A Bark to Unlock

    As technologies develop, manufacturers are making the process of unlocking a phone as user-friendly ...

  2. ●洛谷P2664 树上游戏

    题链: https://www.luogu.org/problemnew/show/P2664题解: 扫描线,线段树维护区间覆盖 https://www.luogu.org/blog/ZJ75211/ ...

  3. [USACO12OPEN]书架Bookshelf

    Description 当农夫约翰闲的没事干的时候,他喜欢坐下来看书.多年过去,他已经收集了 N 本书 (1 <= N <= 100,000), 他想造一个新的书架来装所有书. 每本书 i ...

  4. 全排列hash-康拓展开

    这是对很多全排列问题适用的方法,而且还能用于一些题目的判重 第一位是3,当第一位的数小于3时,那排列数小于321 如 123. 213 ,小于3的数有1.2 .所以有2*2!个.再看小于第二位2的:小 ...

  5. 上传本地项目到Github

    进入要上传的本地文件夹,右键打开Git Bash Here,然后进行以下步骤: 1.在命令行中,输入"git init",使Test文件夹加入git管理: 2.输入"gi ...

  6. 垃圾回收机制(GC)

    垃圾收集器(GC)与内存分配策略 GC需要完成的三件事: 判断哪些内存需要回收 什么时候回收 如何回收 在java内存运行时区域的各个部分中,程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程 ...

  7. Linux/Centos笔记目录

        Linux介绍 Linux入门--个人感想 Google怎么用linux 初入Linux Windows XP硬盘安装Ubuntu 12.04双系统图文详解 实例讲解虚拟机3种网络模式(桥接. ...

  8. 重新设置Eclipse的workspace路径

    有3中方法可以更改workspace的路径设置: 1. 启动Eclipse/MyEclipse后, 打开"Window -> Preferences -> General -&g ...

  9. UML总结4---UML九种图关系说明

    转自:http://blog.csdn.NET/chenyujing1234/article/details/8173519 UML中包括九种图:用例图.类图.对象图.状态图.时序图.协作图.活动图. ...

  10. 数据挖掘_requests模块的post方法

    前面已经跟大家讲了requests模块的get方法,这一篇文章我们要介绍的是requests模块中的另一个比较常用的方法,post方法 post方法的形式相比于get要复杂一些,这时因为post在提交 ...