iOS之NSURLSession(get和post请求)下载

NSURLSession

  • 他是一个基类,不能直接使用,需要使用它的子类
  • NSURLSessionDataTask ,NSURLSessionUploadTask
  • NSURLSessionDownloadTask
NSURLSessionConfiguration
  • NSURLSessionConfiguration是用来配置NSURLSession一些信息的,比如:请求时间,
  • defaultSessionConfiguration创建对象,默认是标准的配置
  • ephemeralSessionConfiguration创建对象,一个预设配置,没有持久性存储的缓存,Cookie或证书。这对于实现像"秘密浏览"功能的功能来说,是很理想的
  • backgroundSessionConfiguration创建对象,它会创建一个后台会话。后台会话不同于常规的,普通的会话,它甚至可以在应用程序挂起,退出,崩溃的情况下运行上传和下载任务。初始化时指定的标识符,被用于向任何可能在进程外恢复后台传输的守护进程提供上下文

NSURLConnection 在iOS9之后就过期了,苹果推出了NSURLSession类来代替NSURLConnection

get请求
  • 注意:NSURLSessionDataTask任务的回调执行是在子线程中的,注意线程之间的通信
- (void)getData
{
    //获取网址
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost/iOS/demo.json"]];
    //创建请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //创建session 回话
    NSURLSession *session = [NSURLSession sharedSession];
    //创建任务
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
         id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"%@",obj);
    }];
    
    //执行任务
    [dataTask resume];
   
}

代理方法请求
//设置代理 遵循协议

- (void)setupDataWithDelegate {
   //获取网址
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost/iOS/demo.json"]];
    //创建请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //创建回话对象
    /*
     1.配置信息
     */
    NSURLSessionConfiguration *defa = [NSURLSessionConfiguration defaultSessionConfiguration];
   
   //使用的队列
    NSOperationQueue *queue = [NSOperationQueue mainQueue];
    
    NSURLSession *session = [NSURLSession sessionWithConfiguration:defa delegate:self delegateQueue:queue];
    
    //创建任务
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
    
    //执行
    [task resume];
    
}


//代理方法

//做出响应的时候
/*
 NSURLSessionResponseCancel = 0,
NSURLSessionResponseAllow = 1,
NSURLSessionResponseBecomeDownload = 2,
NSURLSessionResponseBecomeStream
 
 */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
 completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler{
    //NSURLSessionResponseDisposition 响应描述 是一个枚举值
    //继续响应该是取消
    //必须回调传值,回去,就类似推送一样
   //允许继续响应
    completionHandler(NSURLSessionResponseAllow);
}



//接受数据的时候
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
    didReceiveData:(NSData *)data{
    
    id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSLog(@"%@",obj);
    
}


//完成的时候
- (void)URLSession:(NSURLSession *)session task:(nonnull NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error{
    
    
}




POST请求

- (void)postData {
    //获取网址
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost/iOS/demo.json"]];
    //创建请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //设置请求方法
    request.HTTPMethod = @"POST";
    //设置请求体
    request.HTTPBody = [@"userName=dd&psd=123" dataUsingEncoding:NSUTF8StringEncoding];
    
    //创建session 回话
    NSURLSession *session = [NSURLSession sharedSession];
    //创建任务
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"%@--%@",obj,[NSThread currentThread]);
    }];
    
    //执行任务
    [dataTask resume];
    
    
}

文件下载
  • block下载, 无法监听下载的进度

1.获取URL 2.创建请求 3.创建会话 4.下载 任务 5.启动任务

- (void)getDown {
    
    //1.获取URL
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost/pic.jpg"]];
    //2.创建请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //3.创建会话
    NSURLSession *session = [NSURLSession sharedSession];
    //4.下载 任务
    
    NSURLSessionDownloadTask *loadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //1.获取下载的文件名称
        NSString *nameStr = response.suggestedFilename;
        //获取名字
//        NSString *nameStr  = location.lastPathComponent;
        //路径
        NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask , YES).lastObject;
        
        NSString *fullPath = [cachePath stringByAppendingPathComponent:nameStr];
        
        NSFileManager *manager = [NSFileManager defaultManager];
        

        NSError *moveError = nil;
       [manager moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:&moveError];
        
        UIImage *image = [UIImage imageWithContentsOfFile:fullPath];
        
        //异步函数 回到主队列
        dispatch_async(dispatch_get_main_queue(), ^{
            self.imageView.image = image;
        });
        
       
        
        
        
    }];
    
    //5.启动任务
    [loadTask resume];
    
 
}

在这里插入图片描述

  • 代理下载

1.获取URL 2.创建请求

 //1.获取URL
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost/pic.jpg"]];
    //2.创建请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

3.创建会话 并设置代理遵循NSURLSessionDownloadDelegate
4. 创建下载任务
5.启动任务

//配置
    NSURLSessionConfiguration *def = [NSURLSessionConfiguration defaultSessionConfiguration];
    //队列
    NSOperationQueue *minqueue = [NSOperationQueue mainQueue];
    
    //3.创建会话 并设置代理 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:def delegate:self delegateQueue:minqueue];
    
    //4.创建下载任务
    NSURLSessionDownloadTask *loadTask = [session downloadTaskWithRequest:request];
    //5.启动任务
    [loadTask resume];

实现协议的方法
/**
下载s数据
@param session 会话对象
@param downloadTask 下载任务
@param bytesWritten 本次写入数据的大小
@param totalBytesWritten 下载文件数据的总大小
@param totalBytesExpectedToWrite 文件的总大小
*/

/**
 下载s数据

 @param session 会话对象
 @param downloadTask 下载任务
 @param bytesWritten 本次写入数据的大小
 @param totalBytesWritten 下载文件数据的总大小
 @param totalBytesExpectedToWrite 文件的总大小
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
    
    NSLog(@"下载进度:%f",1.0*totalBytesWritten/totalBytesExpectedToWrite);
    
}

恢复下载的时候 调用

/**
 恢复下载的时候 调用

 @param session 会话对象
 @param downloadTask 下载任务
 @param fileOffset  从上次中断的地方继续下载
 @param expectedTotalBytes 文件的总大小
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
 didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes{
    
   
    
}

下载完成的时候调用\

/**
 下载完成的时候

 @param session 会话对象
 @param downloadTask 下载任务
 @param location 现在完成时候的URL 临时存储在tmp文件里面
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location{
    
    //1.获取下载的文件名称
    NSString *nameStr = downloadTask.response.suggestedFilename;
    //获取名字
    //        NSString *nameStr  = location.lastPathComponent;
    //路径
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask , YES).lastObject;
    
    NSString *fullPath = [cachePath stringByAppendingPathComponent:nameStr];
    
    NSFileManager *manager = [NSFileManager defaultManager];
    
    
    NSError *moveError = nil;
    [manager moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:&moveError];
    
    UIImage *image = [UIImage imageWithContentsOfFile:fullPath];
    
    self.imageView.image = image;
    
}

整个请求结束的时候 调用

//整个请求结束的时候 调用
- (void)URLSession:(NSURLSession *)session task:(nonnull NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error{
    
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值