美文网首页
iOS全解1-4:NSURLSession

iOS全解1-4:NSURLSession

作者: lukyy | 来源:发表于2021-03-12 13:57 被阅读0次

    一、URL Session 的基本概念

    1、三种工作模式:
    • 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权。

    • 瞬时会话模式(ephemeral):该模式不使用磁盘保存任何数据。所有和会话相关的caches,证书,cookies等都被保存在RAM中,因此当程序使会话无效,这些缓存的数据就会被自动清空。

    • 后台会话模式(background):该模式在后台完成上传和下载,在创建Configuration对象的时候需要提供一个NSString类型的ID用于标识完成工作的后台会话。

    2、NSURLSession支持的三种任务

    NSURLSession类支持三种类型的任务:

    • 加载数据:NSURLSessionDataTask
    • 下载:NSURLSessionUploadTask
    • 上传:NSURLSessionDownloadTask

    二、相关的类

    NSURLConnection这个名字,实际上指的是一组构成Foundation框架中URL加载系统的相互关联的组件:

    1、NSURLRequest:请求
    2、NSURLResponse:响应
    3、NSURLProtocol:协议
    4、NSURLCache:沙盒存储
    5、NSHTTPCookieStorage:cookie存储
    6、NSURLCredentialStorage:证书存储
    7、NSURLConnection:链接

    将NSURLConnection替换为NSURLSession和NSURLSessionConfiguration。

    1、NSURLSessionConfiguration 类

    其中NSURLSessionConfiguration用于配置会话的属性,可以通过该类配置会话的工作模式:

    1、+ (NSURLSessionConfiguration *)defaultSessionConfiguration;  
    2、+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration;  
    3、+ (NSURLSessionConfiguration *)backgroundSessionConfiguration:(NSString *)identifier;  
    
    # identifier:指定了会话的ID,用于标记后台的session。
    
    该类的其中两个属性:
    /* 允许请求通过蜂窝路由*/  
    @property BOOL allowsCellularAccess;  
    /* 允许后台任务被安排在系统的裁量权为最佳性能 */  
    @property (getter=isDiscretionary) BOOL discretionary NS_AVAILABLE(NA, 7_0);  
    
    

    allowsCellularAccess属性指定是否允许使用蜂窝连接, discretionary 属性为YES时表示当程序在后台运作时由系统自己选择最佳的网络连接配置,该属性可以节省通过蜂窝连接的带宽。在使用后台传输数据的时候,建议使用discretionary属性,而不是allowsCellularAccess属性,因为它会把WiFi和电源可用性考虑在内。

    补充:

    这个标志允许系统为分配任务进行性能优化。这意味着只有当设备电量充足时,设备才通过Wifi进行数据传输。如果电量低,或者只仅有一个蜂窝连接,传输任务是不会运行的。后台传输总是在discretionary模式下运行。

    2、NSURLSession类

    获取NSURLSession类对象有3种方式:

    + (NSURLSession *)sharedSession;  
    + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;  
    + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration 
                      delegate:(id <NSURLSessionDelegate>)delegate 
                      delegateQueue:(NSOperationQueue *)queue;  
    
    
    第一种方式:

    是使用静态的 sharedSession方法,该类使用共享的会话,该会话使用全局的:Cache、Cookie、证书。

    第二种方式:

    通过 sessionWithConfiguration:方法创建对象,也就是创建对应配置的会话,与NSURLSessionConfiguration合作使用。

    第三种方式:

    通过sessionWithConfiguration:delegate:delegateQueue方法创建对象,二三两种方式可以创建一个新会话并定制其会话类型。该方式中指定了session的委托和委托所处的队列。
    当不再需要连接时,可以调用SessioninvalidateAndCancel直接关闭,或者调用finishTasksAndInvalidate等待当前Task结束后关闭。这时Delegate会收到URLSession:didBecomeInvalidWithError:这个事件。Delegate收到这个事件之后会被解引用。

    3、NSURLSessionTask类

    NSURLSessionTask是一个抽象子类,它有三个子类:-

    • NSURLSessionDataTask
    • NSURLSessionUploadTask
    • NSURLSessionDownloadTask。

    这三个类封装了现代应用程序的三个基本网络任务:获取数据,比如JSON或XML,以及上传和下载文件。
    下面是其继承关系:

    NSURLSessionTask继承关系

    有多种方法创建对应的任务对象:

    (1)NSURLSessionDataTask
    通过request对象或url创建:
    - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request;  
    - (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url;  
    
    
    通过request对象或url创建,同时指定任务完成后通过completionHandler指定回调的代码块:
    - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request 
      completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;  
    - (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url 
      completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;  
    
    
    4、NSURLSessionDelegate和NSURLSessionTaskDelegate协议

    在协议的方法中可以完成各种各样的回调动作,如身份验证完成任务后的动作错误处理后台任务完成的动作等。委托方法指定在NSURLSession中一定数量的字节传输使用int64_t类型的参数。

    # 1、这里只说下后台任务的一个委托方法:
    - (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session 
    NS_AVAILABLE_IOS(7_0);
    
    # 2、合作使用的ApplicationDelegate方法:
    - (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier
            completionHandler:(void (^)())completionHandler NS_AVAILABLE_IOS(7_0); 
    

    将任务切换到后台之后,Session的Delegate不会再收到和Task相关的消息。当所有Task全都完成后,程序将被唤醒,并调用ApplicationDelegate的session 回调,在这里要为后台session(由background session的identifier标识)指定对应的回调代码块。

    随后,对于每一个完成的后台Task调用该Session的Delegate中的URLSession:downloadTask:didFinishDownloadingToURL:(成功后)和URLSession:task:didCompleteWithError:(成功或者失败都会调用)方法做处理,以上的回调代码块可以在这里调用。

    未完待续。。。

    相关文章

      网友评论

          本文标题:iOS全解1-4:NSURLSession

          本文链接:https://www.haomeiwen.com/subject/vkhzqltx.html