IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> IOS开发之网络编程7(NSURLSession) -> 正文阅读

[移动开发]IOS开发之网络编程7(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];
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 12:02:26  更:2021-09-01 12:03:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/21 19:42:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码