一,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;
网友评论