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,以后有时间了可能会添加链接

追寻最真
原文地址:https://www.cnblogs.com/zhao-jie-li/p/5128451.html