网络请求与下载(NSURLSession)

ios开发中,用OC一般使用的是AFNetworking来访问网络请求,那么基本的网络请求怎么访问呢

下面介绍一下平时可能会用到的基本网络请求,案例demo

直接通过URL同步获取数据

这种方式一般是用来下载图片的二进制数据,适用于每次都更新的内容

//开启一个异步线程,在异步线程里面同步请求网络数据
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *url = [NSURL URLWithString:@"https://t7.baidu.com/it/u=4162611394,4275913936&fm=193&f=GIF"];
        NSData *imgData = [NSData dataWithContentsOfURL:url];
        dispatch_async(dispatch_get_main_queue(), ^{
            //加载图片信息
//            self.imageView.image = [UIImage imageWithData:imgData];
        });
    });
复制代码

通过NSURLSession来请求网络数据

以block的方式发起get请求

系统默认为get请求,可以直接通过URL来请求数据

    //测试url不能访问
    NSURL *url = [NSURL URLWithString:@"https://www.test.com/login?uid=abc&pwd=123"];
    NSURLSession *session = [NSURLSession sharedSession];
    //开始以block的形式下载
    //注意:这种请求方式只能为GET
    NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:
    ^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//        data:响应体信息(期望的数据)
//        response:响应头信息,主要是对服务器端的描述
//        error:错误信息,如
        if (!error) {
            //请求成功,data为json格式的序列化数据,请使用NSJSONSerialization来反序列化处理
        }
    }];
    //开始执行任务
    [task resume];
复制代码

以block的方式发起post请求

系统默认请求get,若想改成post的形式请求,必须设置请求提request,通过request可以设置header数据,请求类型(POST)等

NSURL *url = [NSURL URLWithString:@"https://www.test.com/login?uid=abc&pwd=123"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //使用该方式可以
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"askdhfkashdkfsidfusdf" forHTTPHeaderField:@"token"];
    // 默认为GET,POST请求方法需要设置
    request.HTTPMethod = @"POST";
    request.timeoutInterval = 30.0;
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:
    ^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //        data:响应体信息(期望的数据)
        //        response:响应头信息,主要是对服务器端的描述
        //        error:错误信息,如
        if (!error) {
            //请求成功,data为json格式的序列化数据,请使用NSJSONSerialization来反序列化处理
        }
    }];
    [task resume];
复制代码

以代理协议的方式发起post请求

以代理的方式发起post请求需要设置代理,并实现数据下载的代理协议(NSURLSessionDelegate、NSURLSessionDataDelegate),主要是实现NSURLSessionDataDelegate相关下载协议,AFNetworking就是使用的代理实现网络请求

- (void)postDataDelegate {
    self.responseData = [NSMutableData data];
    
    NSURL *url = [NSURL URLWithString:@"https://www.test.com/login?uid=abc&pwd=123"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //使用该方式可以
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"askdhfkashdkfsidfusdf" forHTTPHeaderField:@"token"];
    // 默认为GET,POST请求方法需要设置
    request.HTTPMethod = @"POST";
    request.timeoutInterval = 30.0;
    //使用默认的会话配置,代理和代理回调队列
    NSURLSession *session = [NSURLSession sessionWithConfiguration:
    [NSURLSessionConfiguration defaultSessionConfiguration] 
    delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
    NSURLSessionTask *task = [session dataTaskWithRequest:request];
    [task resume];
}
    
    //设置数据请求的响应方式
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                 didReceiveResponse:(NSURLResponse *)response
                                  completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{
    /*
     NSURLSessionResponseCancel = 0,        默认的处理方式,取消
     NSURLSessionResponseAllow = 1,         接收服务器返回的数据
     NSURLSessionResponseBecomeDownload = 2,变成一个下载请求
     NSURLSessionResponseBecomeStream        变成一个流
     */
    completionHandler(NSURLSessionResponseAllow);
}

//2.接收到服务器返回数据的时候会调用该方法,如果数据较大那么该方法可能会调用多次
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    [self.responseData appendData:data];
}

//3.当请求(下载)完成(成功|失败)的时候会调用该方法,如果请求失败,则error有值
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    if(error == nil)
    {
        //请求成功
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.responseData options:kNilOptions error:nil];
        NSLog(@"%@",dict);
    }else {
        //请求失败
    }
}
复制代码

以代理协议的方式发起下载文件数据

以代理的方式下载文件,需要设置代理,并实现数据下载的代理协议(NSURLSessionDelegate、NSURLSessionDownloadDelegate),主要是实现NSURLSessionDownloadDelegate相关下载协议

//如果想支持断点续联下载,那么需要下载一个url前检查是否本地已经有对应的下载文件,如果有检查其是否下载完毕,没有下载完毕,继续下载即可
- (void)downloadBlock {
    NSURL *url = [NSURL URLWithString:@"https://pic.ibaotu.com/00/48/71/79a888piCk9g.mp4"];
    //设置后台下载会话配置
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"testBackgroundIdentifier"];
    //允许请求通过蜂窝路由
    config.allowsCellularAccess = YES;
    config.timeoutIntervalForRequest = 30;
    //通过block的形式下载,location下载的url,里面有path可以直接打开或者删除移动 就不多说了
//    [NSURLSession sessionWithConfiguration:config];
//    [session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//        if (!error) {
//            //下载成功可以播放
//        }
//    }];
    //使用代理下载
    
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
    //断点续传
//    1.检查文件路径是否存在 通过NSFileManager可以查看
//    2.不存在直接下载,存在获取数据文件继续下载
//    NSData *resumeData = [NSData dataWithContentsOfFile:@"地址"];
//    3.继续下载
//    [session downloadTaskWithResumeData:resumeData];
//    4.后台下载需要注意开启后台任务,避免下载过程出现问题,下载完成可以关闭后台任务
//    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(){}];
    
    
    [session downloadTaskWithURL:url];
}

-(void)URLSession:(nonnull NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
    //获取下载完成百分比
    //float downPro = 1.0 * totalBytesWritten / totalBytesExpectedToWrite;
}

 //下载完成之后调用该方法
-(void)URLSession:(nonnull NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(nonnull NSURL *)location{
//    NSLog(@"location == %@",location.path);
    //可以通过location获取地址,移动或者删除
}

- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{
    NSLog(@"所有后台任务已经完成: %@",session.configuration.identifier);
}
复制代码

断点续传

使用断点续传方式下载文件,需要经过如下几个步骤

1.检查文件路径是否存在 通过NSFileManager可以查看

2.不存在直接下载,存在获取数据文件继续下载,后台下载需要设置NSURLSessionConfiguration配置为后台下载(backgroundSessionConfigurationWithIdentifier:)

NSData *resumeData = [NSData dataWithContentsOfFile:@"地址"];

3.通过获取到的之前的下载数据继续下载

[session downloadTaskWithResumeData:resumeData];

4.后台下载需要注意开启后台任务,避免下载过程出现问题,下载完成可以关闭后台任务

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(){}];

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享