美文网首页iOS-SDK开发
NSURLSession官方介绍

NSURLSession官方介绍

作者: liang1030 | 来源:发表于2021-09-14 16:02 被阅读0次

    一,NSURLSession

    NSURLSession是NSURLConnection的替代API。它提供了影响策略的选项,以及从网络中检索NSURLRequest对象的机制的各个方面。NSURLSession可以绑定到委托对象。在会话的生命周期内,会为某些事件调用委托,例如服务器身份验证或确定是否应该将加载的资源转换为下载。

    NSURLSession实例是线程安全的。

    默认的NSURLSession使用系统提供的委托,适合用于替代使用+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]的现有代码。

    NSURLSession创建NSURLSessionTask对象,它表示加载资源的动作。这些类似于NSURLConnection对象,但提供了更多的控制和统一的委托模型。

    二,NSURLSessionTask

    NSURLSessionTask -- 指处理给定请求的生命周期的可取消对象。

    NSURLSessionTask对象始终在挂起状态下创建,必须在执行它们之前发送-resume消息。

    NSURLSessionTask的子类用于在语法上区分数据和文件下载。

    2.1,NSURLSessionDataTask

    NSURLSessionDataTask不提供比NSURLSessionTask更多的附加功能,其存在只是为了提供与下载和上载任务的词法区别。

    DataTask 对象通过零个或多个委托消息接收有效负载

    NSURLSessionDataTask通过对URLSession:dataTask:didReceiveData:delegate方法的一系列调用来接收资源。这是最常与检索对象以供消费者立即解析相关的任务类型。

    2.2,NSURLSessionUploadTask

    一个NSURLSessionUploadTask目前不提供任何额外的功能超过NSURLSessionDataTask。所有引用NSURLSessionDataTask的委托消息同样适用于NSURLSessionUploadTasks。

    UploadTask对象接收周期性的进度更新,但不返回对象体

    NSURLSessionUploadTask 与 NSURLSessionDataTask 的不同之处在于其实例的构造方式。 上传任务是通过引用要上传的文件或数据对象显式创建的,或者通过使用 -URLSession:task:needNewBodyStream: 委托消息来提供上传主体。

    2.3,NSURLSessionDownloadTask

    NSURLSessionDownloadTask 是一个代表下载到本地存储的任务。

    NSURLSessionDownloadTask 将直接将响应数据写入临时文件。 完成后,委托被发送 URLSession:downloadTask:didFinishDownloadingToURL: 并有机会将此文件移动到其沙盒容器中的永久位置,或以其他方式读取文件。 如果取消,NSURLSessionDownloadTask 可以生成一个数据 blob,可用于稍后恢复下载。

    2.4,NSURLSessionStreamTask

    NSURLSessionStreamTask提供一个接口,用于对通过NSURLSession创建的TCP/IP流执行读写操作。此任务可以从NSURLSession显式创建,也可以作为对-URLSession:dataTask:didReceiveResponse:delegate消息的适当处置响应的结果创建。

    NSURLSessionStreamTask可用于执行异步读写。读和写是串行执行的,并在会话委托队列上调用完成处理程序。如果发生错误,或者任务被取消,所有未完成的读写调用都将使用相应的错误调用其完成处理程序。

    还可以通过向任务发送-captureStreams,从NSURLSessionTask创建NSInputStream和NSOutputStream实例。所有未完成的读写操作都在创建流之前完成。一旦流被传递给会话委托,任务就被认为已完成,将不再接收消息。这些流与基础会话解除关联。

    StreamTask 对象可用于创建 NSInput 和 NSOutputStreams,或直接用于读取和写入。

    从iOS 9和Mac OS X 10.11开始,NSURLSessionStream作为任务类型提供。这允许通过可选的安全握手和代理导航,将TCP/IP直接连接到给定主机和端口。数据任务也可以通过HTTP Upgrade:头和适当使用NSURLSessionConfiguration的管道选项升级到NSURLSessionStream任务。请参阅RFC 2817和RFC 6455,了解有关“升级:头”的信息,以及下面关于将数据任务转换为流任务的注释。

    2.5,NSURLSessionWebSocketTask

    可以使用ws或wss url创建WebSocket任务。客户端还可以提供它希望在WebSocket握手阶段发布的协议列表。一旦握手成功完成,客户端将通过一个可选的委托得到通知。握手完成前入队的所有读写操作将在握手成功后排队并执行。使用与NSURLSessionTask相同的委托进行重定向或身份验证。WebSocket任务也将提供对cookie的支持,并将cookie存储到会话的cookie存储中,并将cookie附加到传出的HTTP握手请求中。

    WebSocket 对象与服务器执行 WebSocket 握手,可用于发送和接收 WebSocket 消息。

    NSURLSessionWebSocketTask 是一项允许客户端连接到支持 WebSocket 的服务器的任务。 该任务将执行 HTTP 握手以升级连接,一旦 WebSocket 握手成功,客户端就可以读取和写入将由框架使用 WebSocket 协议框架的消息。

    三,NSURLSessionConfiguration

    NSURLSession的配置选项。当创建会话时,将创建配置对象的副本—在创建会话后,您不能修改会话的配置。

    shared session使用全局单例证书、缓存和cookie存储对象。

    临时会话没有用于cookie、缓存或证书的持久磁盘存储。

    在某些限制条件下,后台会话可用于代表挂起的应用程序执行网络操作。

    四,NSURLSessionDelegate

    //会话收到的最后一条消息。 会话只会因为系统错误失效,或者当它被明确宣布无效,在这种情况下,错误参数将为 nil。
    - (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(nullable NSError *)error;
    
    //如果实现了,则当发生连接级身份验证挑战时,该委托将有机会向底层连接提供身份验证凭据。某些类型的身份验证将应用于给定服务器连接上的多个请求(SSL服务器信任挑战)。如果未实现此委托消息,则行为将使用默认处理,这可能涉及用户交互。
    - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
                                                 completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler;
    
    //如果应用程序收到 -application:handleEventsForBackgroundURLSession:completionHandler: 消息,会话委托将收到此消息,以指示先前为此会话排队的所有消息都已传递。此时,可以安全地调用以前存储的完成处理程序,或者开始任何导致调用完成处理程序的内部更新。
    - (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session;
    

    4.1,NSURLSessionTaskDelegate

    //当系统准备为设置了延迟启动时间的任务开始工作时发送(使用了earliestBeginDate属性的)。必须调用completionHandler才能继续加载。提供给completion handler的disposition使用提供给任务的原始请求继续加载,使用指定任务替换请求,或取消任务。如果未实现此委托,将继续加载原始请求。
    
    建议:仅当设置了earliestBeginDate属性的任务可能过时并且需要在启动网络负载之前进行更改时,才实现此委托。
    
    如果指定了一个新请求,新请求中的allowsExpensiveNetworkAccess、allowsContrainedNetworkAccess和allowsCellularAccess属性将不会被使用;原始请求的属性将继续使用。
    
    取消任务相当于调用任务的cancel方法;将调用URLSession:task:DidCompleteWitherError:task委托,错误为NSURErrorCancelled。
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                            willBeginDelayedRequest:(NSURLRequest *)request
                                  completionHandler:(void (^)(NSURLSessionDelayedRequestDisposition disposition, NSURLRequest * _Nullable newRequest))completionHandler;
    
    //由于当前网络连接不可用或不足以满足任务的请求,任务无法启动网络加载过程时发送。
    
    每个任务最多调用一次此委托,并且仅当NSURLSessionConfiguration中的waitsForConnection属性设置为YES时才会调用此委托。
    
    后台会话永远不会调用此委托回调,因为这些会话会忽略waitForConnectivity属性。
    - (void)URLSession:(NSURLSession *)session taskIsWaitingForConnectivity:(NSURLSessionTask *)task;
    
    //HTTP请求试图重定向到不同的URL。您必须调用完成例程以允许重定向,允许使用修改后的请求进行重定向,或者将nil传递给completionHandler,以使重定向响应的主体作为此请求的负载传递。默认设置是遵循重定向。
    
    对于后台会话中的任务,将始终遵循重定向,并且不会调用此方法。
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                         willPerformHTTPRedirection:(NSHTTPURLResponse *)response
                                         newRequest:(NSURLRequest *)request
                                  completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler;
    
    //任务已收到特定于请求的身份验证质询。如果未实现此委托,则将*不*调用特定于会话的身份验证质询,其行为将与使用默认处理处置相同。
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                                didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge 
                                  completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler;
    
    //如果任务需要新的、未打开的正文流,则发送。当涉及主体流的任何请求的身份验证失败时,这可能是必要的。
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                                  needNewBodyStream:(void (^)(NSInputStream * _Nullable bodyStream))completionHandler;
    
    //定期发送以通知代理上传进度。此信息也可作为任务的属性使用。
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                                    didSendBodyData:(int64_t)bytesSent
                                     totalBytesSent:(int64_t)totalBytesSent
                           totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend;
    
    //当收集到任务的完整统计信息时发送。
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics;
    
    //作为与特定任务相关的最后一条消息发送。Error可以为nil,这意味着没有发生错误,任务已经完成。
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                               didCompleteWithError:(nullable NSError *)error;
    

    4.2,NSURLSessionDataDelegate

    //任务已经收到了响应,在调用completion block之前不会再收到任何消息。disposition允许您取消请求或将数据任务转换为下载任务。此委托消息是可选的—如果您不实现它,您可以将从任务的属性中获取response。对于后台上传任务(不能转换为下载任务),此方法不会被调用。
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                     didReceiveResponse:(NSURLResponse *)response
                                      completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;
    
    //数据任务已成为下载任务的通知。以后不会向数据任务发送任何消息。
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                  didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask;
    
    //数据任务已成为双向流任务的通知。以后不会向数据任务发送任何消息。新创建的streamTask将原始请求和响应作为属性携带。
    
    //对于管道化的请求,流对象将只允许读取,并且该对象将立即发出-URLSession:writeClosedForStream:。可以对会话中的所有请求禁用管道,也可以通过NSURLRequest HttpShouldUsePipeline属性禁用管道。
    
    //基础连接不再被视为HTTP连接缓存的一部分,并且不会计入每个主机的连接总数。
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                    didBecomeStreamTask:(NSURLSessionStreamTask *)streamTask;
    
    //当数据可供代理使用时发送。假定代理将retain(保留)而不是copy(复制)数据。由于数据可能不连续,您应该使用[NSData Enumerated ByTerangeSusingBlock:]访问它。
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                         didReceiveData:(NSData *)data;
    
    //使用有效的NSCachedURLResponse调用完成例程以允许缓存结果数据,或传递nil以防止缓存。请注意,不能保证将尝试对给定资源进行缓存,并且您不应该依赖此消息来接收资源数据。
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                      willCacheResponse:(NSCachedURLResponse *)proposedResponse 
                                      completionHandler:(void (^)(NSCachedURLResponse * _Nullable cachedResponse))completionHandler;
    

    4.3,NSURLSessionDownloadDelegate

    //当下载任务完成下载时发送。代理应将给定位置的文件复制或移动到新位置,因为当代理消息返回时,该文件将被删除。URLSession:task:didCompleteWithError:消息仍将被调用。
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
                                  didFinishDownloadingToURL:(NSURL *)location;
    
    @optional
    //定期发送,通知委托下载进度。
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
                                               didWriteData:(int64_t)bytesWritten
                                          totalBytesWritten:(int64_t)totalBytesWritten
                                  totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;
    
    //当恢复下载时发送。如果下载失败并出现错误,则错误的-userInfo字典将包含NSURLSessionDownloadTaskResumeData键,其值为恢复数据。
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
                                          didResumeAtOffset:(int64_t)fileOffset
                                         expectedTotalBytes:(int64_t)expectedTotalBytes;
    

    4.4,NSURLSessionStreamDelegate

    @optional
    
    //指示连接的读取端已关闭。任何未完成的读取都将完成,但将来的读取将立即失败。即使未进行读取,也可能会发送此消息。但是,当收到此委托消息时,可能仍有可用字节。只有当您能够读取到EOF时,才知道没有更多的字节可用。
    - (void)URLSession:(NSURLSession *)session readClosedForStreamTask:(NSURLSessionStreamTask *)streamTask;
    
    //指示连接的写入端已关闭。所有未完成的写入操作都已完成,但将来的写入操作将立即失败。
    - (void)URLSession:(NSURLSession *)session writeClosedForStreamTask:(NSURLSessionStreamTask *)streamTask;
    
    //系统已确定检测到到主机的更好路由的通知(例如,wi-fi接口可用),这是对委托的一个提示,可能需要为后续工作创建一个新任务。注意,不能保证将来的任务能够连接到主机,因此调用者应该为在任何新接口上读取和写入失败做好准备。
    - (void)URLSession:(NSURLSession *)session betterRouteDiscoveredForStreamTask:(NSURLSessionStreamTask *)streamTask;
    
    //给定的任务已经完成,未打开的 NSInputStream 和 NSOutputStream 对象是从底层网络连接创建的。这只会在所有排队的 IO 完成后调用(包括任何必要的握手)。streamTask将不再接收任何委托消息。
    - (void)URLSession:(NSURLSession *)session streamTask:(NSURLSessionStreamTask *)streamTask
                                     didBecomeInputStream:(NSInputStream *)inputStream
                                             outputStream:(NSOutputStream *)outputStream;
    

    4.5,NSURLSessionWebSocketDelegate

    //表示WebSocket握手成功,连接已经升级到WebSocket。它还将提供在握手中选择的协议。如果握手失败,将不会调用此委托。
    - (void)URLSession:(NSURLSession *)session webSocketTask:(NSURLSessionWebSocketTask *)webSocketTask didOpenWithProtocol:(NSString * _Nullable) protocol;
    
    //表示 WebSocket 已收到来自服务器端点的关闭帧。如果服务器选择在关闭帧中发送此信息,则委托可以提供关闭代码和关闭原因。
    - (void)URLSession:(NSURLSession *)session webSocketTask:(NSURLSessionWebSocketTask *)webSocketTask didCloseWithCode:(NSURLSessionWebSocketCloseCode)closeCode reason:(NSData * _Nullable)reason;
    

    相关文章

      网友评论

        本文标题:NSURLSession官方介绍

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