美文网首页
1.3 NSURLSession 数据请求,下载,上传

1.3 NSURLSession 数据请求,下载,上传

作者: 草根小强 | 来源:发表于2019-04-17 17:05 被阅读0次

    NSURLSession 数据请求,下载,上传

    #import "ViewController.h"
    #define BASE_URL @"http://iappfree.candou.com:8080/free/applications/limited"
    #define IMG_URL @"http://a.hiphotos.baidu.com/image/pic/item/55e736d12f2eb938d3de795ad0628535e4dd6fe2.jpg"
    
    @interface ViewController () <NSURLSessionDownloadDelegate>
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
       //NSURLConnection 在iOS 8之后已经不推荐使用了,
       //苹果建议,用NSURLSession 来做数据请求
        
        //session有三种任务模式
        //1、dataTask 数据请求任务(默认)
        
            [self session];
        
        //2、downloadTask 下载任务
        //3、uploadTask 上传任务
    
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //  [self downloadTak];
        [self downloadTak2];
    }
    
    #pragma mark ------------下载任务-------------
    - (void)downloadTak {
        
        //1、获取session 单例
        NSURLSession *session = [NSURLSession sharedSession];
        
        //2、下载任务
       NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:IMG_URL] completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
            
            //这里是下载的回调
            //location:表示文件下载的位置
            NSLog(@"%@",location.absoluteString);
           //沙盒
           //因为下载的路径,默认是tmp文件夹下面的,所以我们需要在下载完成之后,把内容拷贝到新的位置 Document下面
    //       NSFileManager *manager = [NSFileManager defaultManager];
    //       manager copyItemAtPath:<#(NSString *)#> toPath:<#(NSString *)#> error:<#(NSError *__autoreleasing *)#>
        }];
        
        //3、开始任务
        [task resume];
    }
    
    //有进度的下载
    - (void)downloadTak2 {
        //1、实例化一个session,并且设置代理
        //session 还有三种会话模式
        //
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
        
        //2、开启一个下载任务
        NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:IMG_URL]];
        
        //3、开始下载
        [task resume];
    }
    
    #pragma mark --------有进度的下载的协议方法-------------
    //下载完成之后的回调
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
        NSLog(@"%@",location);
    }
    
    //有关进度
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
          didWriteData:(int64_t)bytesWritten
     totalBytesWritten:(int64_t)totalBytesWritten
    totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
        
        //后两个参数
        //totalBytesWritten 表示已经下载的大小
        //totalBytesExpectedToWrite  表示总大小
        float progress = totalBytesWritten / (float)totalBytesExpectedToWrite;
        NSLog(@"%f",progress);
        
    }
    
    #pragma mark ---------数据请求任务----------
    - (void)session {
        //1、实例化一个session
        NSURLSession *session = [NSURLSession sharedSession];
        
        //2、数据请求任务
         NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:IMG_URL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            
            //这里是数据请求后,服务器的响应
            //data:请求到的数据
            //response:响应头
            //error:错误日志
            
            if (error) {
                //请求失败
                NSLog(@"%@",error);
            }else {
    //            //请求成功
    //            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    //            NSLog(@"%@",dict);
                
                
                //1、实例化一个imageView 并展示图片
    #warning 所谓异步请求,其实就是开辟了一个新的线程(子线程),在子线程中进行同步的请求,线程我们可以理解为一个通道,NSURLSession数据请求成功后,依然在子线程里面做的回调,然而子线程里面是不能够进行UI操作的
                dispatch_async(dispatch_get_main_queue(), ^{
                    UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.view.bounds];
                    imageView.image = [UIImage imageWithData:data];
                    [self.view addSubview:imageView];
                    NSLog(@"加载完成");
                });
                
            }
        }];
        
        //3、开始任务
        [task resume];
    }
    @end
    
    
    NSURLSession 数据请求.png

    相关文章

      网友评论

          本文标题:1.3 NSURLSession 数据请求,下载,上传

          本文链接:https://www.haomeiwen.com/subject/hhunwqtx.html