zoukankan      html  css  js  c++  java
  • NSURLSessionConfiguration的简单实用

    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

     

    追寻最真
  • 相关阅读:
    vue+vuex构建单页应用
    vue如何做分页?
    cookie和session的原理机制
    经常遇到js的面试题
    CSS浏览器兼容性问题解决方法总结
    前端性能优化----yahoo前端性能团队总结的35条黄金定律
    bom对象
    正则表达式
    JavaScript
    常见浏览器bug以及解决方法
  • 原文地址:https://www.cnblogs.com/zhao-jie-li/p/5043215.html
Copyright © 2011-2022 走看看