AFNetworking的原理解析

通过查看AFNetworking源码可以知道是通过NSURLSession来实现的,所以还是要理解NSURLSession。

1、NSURLSessionTask的子类

NSURLSessionTask 包括 NSURLSessionDataTask 与 NSURLSessionDownloadTask。

NSURLSessionDataTask:可以处理常用的GET,POST请求。

NSURLSessionDownloadTask:用于处理下载请求。

2、GET

NSURLSession * session = [NSURLSession sharedSession];
    NSURLSessionDataTask * task = [session dataTaskWithURL:[NSURL URLWithString:urlStr] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        
    }];
[task resume];

3、POST

NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStr]];
request.HTTPMethod = @"POST";
request.HTTPBody = [@"appID=1" dataUsingEncoding:NSUTF8StringEncoding];
NSURLSession * session = [NSURLSession sharedSession];
NSURLSessionDataTask * postTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        
    }];
[postTask resume];

4、NSURLSessionDataTask下载

NSURLSessionDataTask * downloadTask = [session dataTaskWithURL:[NSURL URLWithString:urlStr] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
       
        UIImage * image = [UIImage imageWithData:data];
       
    }];
[downloadTask resume];

5、NSURLSessionDownloadTask下载

NSURLSessionDownloadTask * downloadTask = [session downloadTaskWithURL:[NSURL URLWithString:urlStr] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        // 会下载到一个临时文件.tmp,所以需要我们把文件移动到cache文件中重新保存
        // 目标文件路径
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
       // 移动到目标路径
        [[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:path] error:nil];
        
        UIImage * image = [UIImage imageWithContentsOfFile:path];
        
        
    }];
[downloadTask resume];

此处需要注意:需要把临时文件.tmp 移动到cache文件中保存。

其中 response.suggestedFilename 为推荐的文件名,用于将.tmp文件转换为可使用的文件,用代理实现时可以通过 downloadTask.response.suggestedFilename 获取对应的推荐名。

6、两种下载方式的不同

NSURLSessionDataTask:最原始的请求方式,所以大部分的请求都能用他完成,不过好多逻辑需要我们自己处理。

NSURLSessionDownloadTask:专门用于下载请求,对内存消耗有很好的处理,并且实时将下载内容存入沙河临时文件。

7、取消请求

[postTask cancel]; 直接取消请求,进入请求失败方法;如果请求已发送成功,则取消失败。

[session finishTasksAndInvalidate];  等请求完成以后取消请求。

[session invalidateAndCancel]; 直接取消请求

8、断点下载

后续添加 断点下载

9、遇到的问题

如果下载时下载不成功,遇到since it does not conform to ATS policy问题,则需要在plist中添加以下代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值