iOS 开发 NSURLSession使用大全详解(包括请求,上传和断点下载)

NSURLSession基本特点

  • 用于替代 NSURLConnection
  • 支持后台运行的网络任务
  • 暂停、停止、重启网络任务,不再需要 NSOperation 封装
  • 请求可以使用同样的配置容器
  • 直接使用系统方法可以实现文件上传和下载
  • 通过代理方法可以获取文件上传和下载的进度
  • block 和代理都对文件上传和下载起作用
    • 当文件上传时,block和代理可以同时使用
    • 当文件下载时,block和代理不要同时使用

NSURLSession结构图

这里写图片描述

  • 为了方便程序员使用,苹果提供了一个全局 session.
  • 所有的 任务(Task) 都是由 session 发起的.
  • 所有的任务默认是挂起的,需要 resume.
  • session可以自定义,自定义的时候可以同时设置代理.
  • session : 如果你要监听上传进度,就不能使用单例session,因为监听上传进度需要使用代理.我们需要自定义session

NSURLSessionConfiguration

用于设置全局的网络会话属性,包括:身份验证,超时时长,缓存策略,Cookie 等.

  • 常用属性

这里写图片描述

  • 三个类构造方法,是为不同的案例设计的.

    • defaultSessionConfiguration 返回标准配置,具有共享 NSHTTPCookieStorage,NSURLCache 和 NSURLCredentialStorage.

    • ephemeralSessionConfiguration 返回一个预设配置,没有持久性存储的缓存,Cookie或证书。这对于实现像秘密浏览功能的功能来说,是很理想的.

    • backgroundSessionConfiguration,独特之处在于,会创建一个后台会话。后台会话不同于常规的,普通的会话,它甚至可以在应用程序挂起,退出,崩溃的情况下运行上传和下载任务。初始化时指定的标识符,被用于向任何可能在进程外恢复后台传输的守护进程提供上下文.

  • 常用 HTTPAdditionalHeaders

//接收数据类型,语言,设备类型
configuration.HTTPAdditionalHeaders = @{
@"Accept": @"application/json",
@"Accept-Language": @"en",
@"User-Agent": @"iPhone"
};
  • NSURLSessionConfiguration使用.

/// 自定义session,设置配置信息 @property (nonatomic, strong) NSURLSession
*session;

//开发中没有额外需求可以不用设置
- (NSURLSession *)session {
    if (_session == nil) {
        // 创建配置信息 : 开发中只需要使用默认的配置信息就好了
        // 当多个任务共享同一个session时候,我们只需要配置一次config,那么有session发起的所有任务,都具备相同的配置信息
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

        // 请求的超时时长是1秒
        config.timeoutIntervalForRequest = 5.0;
        config.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
        // 告诉服务器我的设备
        config.HTTPAdditionalHeaders = @{@"User-Agent": @"iPhone"};

        _session = [NSURLSession sessionWithConfiguration:config];
    }
    return _session;
}

NSURLSession的GET请求

  1. 准备URL
  2. session
  3. 发起任务(task)
  4. 启动任务(resume)
  5. 处理响应
/// NSURLSession的GET请求 (默认也是GET请求)
- (void)demo {
    // URL
    NSURL *URL = [NSURL URLWithString:@"http://localhost/php/login/login.php?username=zhangsan&password=zhang"];
    // 获取session(单例)
    NSURLSession *session = [NSURLSession sharedSession];
    // 发起任务
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:URL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 处理响应
        if (error == nil && data != nil) {
            // 反序列化
            NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
            NSLog(@"%@",result);
        } else {
            NSLog(@"%@",error);
        }
    }];

    // 启动任务
    [dataTask resume];
}

NSURLSession的POST请求

  1. 准备URL
  2. 创建可变request (设置请求方法和请求体)
  3. session
  4. 发起任务(task)
  5. 启动任务(resume)
  6. 处理响应
- (void)login {
    // URL
    NSURL *URL = [
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值