• NSURLSession


    Demo_2 NSURLSession

    NSURLSession的出世就意味着前面提到的NSURLConnection的灭亡,进化论规律,前辈都被拍死在沙滩上,说笑,下面进入正题

    1.     所谓后来者居上,那也是继承了前辈的优点

    >创建NSURLRequest必不可少

    >紧接着创建NSURLSession对象: 这里创建对象用的是单例模式,单例模式的优点和作用就不在这单独讲解了,改天专门拿出来讲(嘻嘻,其实我也是水的很).

    >这里比NSURLConnection多的就是要创建任务 ,

    任务分为两种: NSURLSessionDownloadTask 下载任务

       NSURLSessionDataTask       数据任务     

      两种区别在哪里呢?

    1.     下载任务:执行时会返回一个临时文件放在沙盒的tmp文件中,当程序结束后就会被系统自动删除,所以 如果想要保存的话,就在删除之前将它移出来,方法见前面的Filemanager讲解的文件管理文章

    2.     数据任务:下载时,下载的资源会被存在内存的data变量中

     说完了区别,那么两者的共同点在哪里?

    1.两者在下载完成之后的返回操作都是在分线程中完成,如果想要在这里面添加UI的现实,就必须使用GCD或者其他线程方法放回到主线程中(线程方法前面文章有介绍).

    下面看一个Demo加深理解

    //下载任务:图片下载到tmp文件中

    -   (IBAction)downloadImageByDownloadTask:(UIButton *)sender {

    //添加网络标识

        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

        //1.创建NSURLRequest对象

        NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://baike.soso.com/p/20090711/20090711101754-314944703.jpg"]];

        //2.创建NSURLSession

        NSURLSession *session=[NSURLSession sharedSession];

        //3.创建下载任务对象

        NSURLSessionDownloadTask *task=[session downloadTaskWithRequest:request     completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {

            //明确线程

            NSLog(@"线程: %@",[NSThread currentThread]);

            NSLog(@"本地储存位置%@",location);

            NSLog(@"路径:%@",location.path);

            //清楚回调的三个参数

            //方案1 loaction-- >UIimage

            UIImage *image=[UIImage imageWithData:[NSData dataWithContentsOfFile:location.path]];

            //方案2: 马上移到Library/Caches

            NSString*cacahesPath= NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;

            NSString *iamgePath=[cacahesPath stringByAppendingPathComponent:response.suggestedFilename ];

                error=nil;

            if(! [[NSFileManager defaultManager] moveItemAtPath:location.path toPath:iamgePath error:&error]){

                NSLog(@"移动失败,原因:%@",error.userInfo);

            }

            //回到主线程

            dispatch_async(dispatch_get_main_queue(), ^{

                self.imageView.image=image;

                [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

            });

           

        }];

       

        //4.执行下载任务

        [task resume];

    }

    其中block 中返回的数据都是在下载结束后才得到的,出了block后就会被释放,所以关于文件数据的保存都在这里进行,其实看方法名就可以知道completionHandler

     

     

     

    下面给出数据下载任务的部分Demo

     

    - (IBAction)downloadImageByDataTask:(UIButton *)sender {

        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

        //1.NSURLRequest

        NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://pic1.nipic.com/2009-02-19/200921922311483_2.jpg"]];

        //2.单例的方式

        NSURLSession *session=[NSURLSession sharedSession];

        //3.数据任务(资源存在内存的data变量中)

        NSURLSessionDataTask *task=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

            //看看线程

            NSLog(@"线程%@",[NSThread currentThread]);

           //NSLog(@"data:%@",data);

            dispatch_async(dispatch_get_main_queue(), ^{

                self.imageView.image=[UIImage imageWithData:data];

                [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

            });

        }];;

        //执行下载任务(异步执行)

        [task resume];

        NSLog(@"下载完毕");

    }

    如果需要完整版的Demo可以私信可我, 现在没有时间上传到GitHub,以后有时间了可能会添加链接

    追寻最真
  • 相关阅读:
    对我人生影响最大的三位老师
    自我介绍
    转-一般产品的使用过程
    谷歌浏览器开发调试工具中Sources面板 js调试等 完全介绍 --转载
    接口测试--总结
    常见正则表达式
    B/S架构的软件,主要的功能测试点有哪些
    SQL语句大全转
    11.2
    11.1
  • 原文地址:https://www.cnblogs.com/zhao-jie-li/p/5128451.html
Copyright © 2020-2023  润新知