NSURLSessionStreamTask 大致说明
基于流的URL会话任务。
NSURLSessionStreamTask是NSURLSessionTask的一个具体子类。NSURLSessionStreamTask类中的许多方法都记录在NSURLSessionTask中。
NSURLSessionStreamTask类提供了一个通过NSURLSession创建的TCP/IP连接接口。
可以使用streamTaskWithHostName:port:和streamTaskWithNetService:方法从NSURLSession创建任务。
它们也可能是通过HTTP Upgrade: response报头升级NSURLSessionDataTask并适当使用NSURLSessionConfiguration的HTTPShouldUsePipelining选项而创建的。
NSURLSessionStreamTask对象执行s异步读和写,它们被排队并串行执行,在会话委托队列上完成时调用处理程序。
如果任务被取消,所有进入队列的读和写将使用适当的错误调用它们的完成处理程序。
当使用接受NSStream对象的api时,您可以通过调用captureStreams方法从NSURLSessionStreamTask对象创建NSInputStream和NSOutputStream对象。
NSURLSessionStreamTask提供一个接口来执行对通过NSURLSession创建的TCP/IP流的读写。
此任务可以显式地从NSURLSession创建,也可以作为-URLSession:dataTask:didReceiveResponse: delegate消息的适当配置响应的结果创建。
NSURLSessionStreamTask可用于执行异步读写。
读和写是串行查询和执行的,在会话委托队列上调用完成处理程序。
如果发生错误,或者任务被取消,所有未执行的读和写调用都将使用适当的错误调用它们的完成处理程序。
通过向任务发送 - captureStreams,还可以从NSURLSessionTask创建NSInputStream和NSOutputStream实例。
所有未完成的读和写都在流创建之前完成。
一旦流被交付给会话委托,任务就被认为是完成的,不会再接收任何消息。
这些流与底层会话分离。
NSURLSessionStreamTask 属性和方法说明
- (void)readDataOfMinLength:(NSUInteger)minBytes maxLength:(NSUInteger)maxBytes timeout:(NSTimeInterval)timeout completionHandler:(void (^) (NSData * _Nullable data, BOOL atEOF, NSError * _Nullable error))completionHandler;
异步地从流中读取大量字节,并在完成时调用处理程序。
读取minBytes,或者最多读取maxBytes,然后使用数据或错误调用会话委托队列上的完成处理程序。
如果发生错误,任何未完成的读取也将失败,新的读取请求将立即出错。
- (void)writeData:(NSData *)data timeout:(NSTimeInterval)timeout completionHandler:(void (^) (NSError * _Nullable error))completionHandler;
异步地将指定的数据写入流,并在完成时调用处理程序。
不能保证流的远程端在调用completionHandler时收到了所有写好的字节,只能保证所有的数据都写到了内核
将数据完全写入底层套接字。
如果超时没有写入所有字节,将发生超时错误。
注意,对completion handler的调用并不保证远程端已经接收了所有字节,只保证它们已经被写到内核中。
- (void)captureStreams;
完成任何已经进入队列的读和写,然后调用URLSession:streamTask:didBecomeInputStream:outputStream: delegate消息。
完成任何已经进入队列的读和写,然后调用URLSession:streamTask:didBecomeInputStream:outputStream: delegate消息。
当接收到该消息时,任务对象将被视为已完成,不再接收任何委托消息。
- (void)closeWrite;
完成任何入队列的读和写,然后关闭底层套接字的写端。
调用此方法后,可以继续使用readDataOfMinLength:maxLength:timeout:completionHandler:方法读取数据。调用此方法后,对writeData:timeout:completionHandler:的任何调用都会导致错误。
因为服务器可能会继续向客户机写入字节,所以建议您继续读取,直到流到达文件末尾(EOF)。
请求排队以关闭底层套接字的写端。
所有未完成的IO将在套接字的写端关闭之前完成。
但是,服务器可能会继续将字节写回客户机,因此最佳实践是继续从服务器读取,直到收到EOF。
- (void)closeRead;
完成任何入队列的读和写,然后关闭底层套接字的读端。
调用此方法后,可以继续使用writeData:timeout:completionHandler:方法编写数据。调用此方法后,对readDataOfMinLength:maxLength:timeout:completionHandler:的任何调用都会导致错误。
请求排队以关闭底层套接字的读端。
所有未完成的IO将在读取端关闭之前完成。
您可以继续向服务器写入。
- (void)startSecureConnection;
完成任何已加入队列的读和写,并建立安全连接。
使用URLSession:task:didReceiveChallenge:completionHandler:方法将身份验证回调发送到会话的委托。
开始加密的握手。
hanshake在所有待处理的IO完成后开始。
TLS身份验证回调被发送到会话的-URLSession:task:didReceiveChallenge:completionHandler:
- (void)stopSecureConnection;
完成任何已加入队列的读和写,并关闭安全连接。
在所有挂起的安全IO完成之后,干净地关闭安全连接。
网友评论