IOS开发之网络编程(常用的自带的网络请求:NSURLSession)

NSURLSession

之前发送网络请求的过程URL-URLRequest-URLConnectionNSURLSession面向任务,更加高级

  • NSURLSession- iOS7.0以后
    用于替代 NSURLConnection
    支持后台运行的网络任务
    暂停、停止、重启网络任务,不再需要自己封装 NSOperation
    下载、断点续传、异步下载
    上传、异步上传
    获取下載、上传的进度
  • NSURLSession可以发起以下任务,默认所有的任务都是挂起的:DataTask UploadTask DownloadTask
  • NSURLSessionConfigration:配置请求的信息

DataTask

  • [NSURLSession sharedSession]默认返回一个单例对象,默认发送get请求
    NSURL *url = [NSURL URLWithString:@""];
    NSURLSession *session = [NSURLSession sharedSession];
    //任务默认是挂起
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
        NSLog(@"hello");
    }];
    //开始任务
    [dataTask resume];
  • 发送POST请求
    NSURL *url = [NSURL URLWithString:@""];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    NSString *body = @"username=123&password=123";
    request.HTTPMethod = @"post";
    request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
    
    NSURLSession *session = [NSURLSession sharedSession];
    //任务默认是挂起
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
        NSLog(@"hello");
    }];
    //开始任务
    [dataTask resume];

DownloadTask

下载DownloadTask默认把文件下载到沙盒的tmp文件夹,下载完成后不会文件做任何操作,会自动删除文件,下载过程是异步的

  • 尝试使用
    NSURL *url = [NSURL URLWithString:@""];
    
    [[[NSURLSession sharedSession]downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //获取可用目录
        NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        //文件移动
        [[NSFileManager defaultManager] copyItemAtPath:location.path toPath:doc error:NULL];
    }]resume];
  • 正式使用:文件下载,包括进度显示,断点续传
#import "ViewController.h"
@interface ViewController () <NSURLSessionDownloadDelegate>
@property(nonatomic,strong)NSURLSession *session;
@property(nonatomic,strong)NSURLSessionDownloadTask *downloadTask;
@property(nonatomic,strong)NSData *resumeData;//暂停的数据
@end

@implementation ViewController
#pragma mark - 懒加载
-(NSURLSession *)session{
    if (_session ==nil) {
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue new]];
    }
    return _session;
}

#pragma mark - NSURLSessionDownloadDelegate
//下载完成
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
    NSLog(@"下载完成:%@",location);
}
//断点续传的方法
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{
    NSLog(@"断点续传");
}
//获取进度的方法
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
    float process = totalBytesWritten*1.0/totalBytesExpectedToWrite;
    NSLog(@"下载进度:%f",process);
}

#pragma mark - 下载
//下载
-(void)download{
    NSURL *url = [NSURL URLWithString:@""];
    NSURLSessionDownloadTask *downloadTask = [self.session downloadTaskWithURL:url];
    self.downloadTask = downloadTask;
    [downloadTask resume];
}

//暂停下载
-(void)pause{
    [self.downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
        self.resumeData = resumeData;
        //把续传数据保存到沙盒中,可省略
        //路径
        NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"test.tmp"];
        //存进沙盒
        [self.resumeData writeToFile:path atomically:YES];
        
        //记得清空downloadTask
        self.downloadTask = nil;
    }];
}
//继续下载
-(void)resume{
    //从沙盒取数据,可以省略
    NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"test.tmp"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if([fileManager fileExistsAtPath:path]){
        self.resumeData = [NSData dataWithContentsOfFile:path];
    }

    //如果为空直接退出
    if(self.resumeData == nil){return;}
    //重新创建downloadTask
    self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];
    [self.downloadTask resume];
    self.resumeData = nil;
}

#pragma mark - 主函数
 - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}
@end
  • 创建session的时候,队列设置为nil,和写[[NSOperationQueue alloc]init]的效果是一样的
_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值