stream编程模式提供了与 unix 的文件操作类似的模式。首先创建和设置流,接着打开流,然后读写流,在流存在时还可以通过查询流的相关属性来读取流的相关信息,在流使用完毕后关闭流。
iOS 为stream编程模式提供的api编程接口包括两大类,一类是Core Foundation框架层用C语言实现的CFStream API(包括CFStream、 CFReadStream 、CFWriteStream等),一类是基于其上的在Foundation框架层用Objective-C语言实现的NSStream API(包括NSStream、NSInputStream NSOutputStream等),两者提供相似的接口和行为,其中某些对象是toll-free bridged类型的,如CFStream 与NSStream,CFReadStream与NSInputStream,CFWriteStream与NSOutputStream之间,因此可以混合使用。
开发人员可以根据自己的语言偏好选择使用。
CFStream API的主要接口:
1、CFStream 创建接口
1.1 CFStreamCreatePairWithPeerSocketSignature
功能:创建一对到一个socket的可读和可写流。
1.2 CFStreamCreatePairWithSocketToHost
功能:创建连接到一个特定主机的特定端口的一对可读写流。
1.3 CFStreamCreatePairWithSocket
功能:创建一对连接到一个socket的可读写流
1.4 CFStreamCreateBoundPair
功能:创建一对读写流。
其它可读写流创建接口:
1.5 CFReadStreamCreateForHTTPRequest
功能:为一个CFHTTP请求创建一个可读流。
1.6 CFReadStreamCreateForStreamedHTTPRequest
功能:为一个HTTP请求的body保持在内存的CFHTTP请求创建一个可读流。
1.7 CFReadStreamCreateWithFTPURL
功能:创建一个FTP可读流
1.8 CFWriteStreamCreateWithFTPURL
功能:创建一个FTP可读流
2. CFReadStream接口
2.1 流的打开和关闭
CFReadStreamOpen
CFReadStreamClose
2.2 读取数据
CFReadStreamRead
2.3. 调度一个可读流
CFReadStreamScheduleWithRunLoop(_:_:_:)
CFReadStreamUnscheduleFromRunLoop(_:_:_:)
2.4 检查可读流的属性
CFReadStreamCopyProperty(_:_:)
CFReadStreamGetBuffer(_:_:_:)
CFReadStreamCopyError(_:)
CFReadStreamGetError(_:)
CFReadStreamGetStatus(_:)
CFReadStreamHasBytesAvailable(_:)
2.5 设置可读流的属性
CFReadStreamSetClient(_:_:_:_:)
CFReadStreamSetProperty(_:_:_:)
2.6 得到 CFReadStream的 Type ID
CFReadStreamGetTypeID()
3.CFWriteStream 相关接口
3.1 CFWriteStreamClose(_:)
3.2 CFWriteStreamOpen(_:)
3.3 CFWriteStreamWrite(_:_:_:)
3.4 CFWriteStreamScheduleWithRunLoop(_:_:_:)
3.5 CFWriteStreamUnscheduleFromRunLoop(_:_:_:)
3.6 CFWriteStreamCanAcceptBytes(_:)
3.7 CFWriteStreamCopyProperty(_:_:)
3.8 CFWriteStreamCopyError(_:)
3.9 CFWriteStreamGetError(_:)
3.10 CFWriteStreamGetStatus(_:)
3.11 CFWriteStreamSetClient(_:_:_:_:)
3.12 CFWriteStreamSetProperty(_:_:_:)
3.13 CFWriteStreamGetTypeID()
CFStream API的使用步骤:
1) 利用流创建接口创建相关流;
2)、调用CFReadStreamSetClient (可读流)或CFWriteStreamSetClient (可写流)来登记要接收的流相关的事件;
3)、调用CFReadStreamScheduleWithRunLoop(可读流)或CFWriteStreamScheduleWithRunLoop(可写流)来使在流在一个run loop上进行调度以便接收相关事件;
4)、调用CFReadStreamOpen 或CFWriteStreamOpen 来打开已创建的流;
5)、在读取流的创建时登记的回调中,在接收到kCFStreamEventHasBytesAvailable事件时来读取数据, 在可写流已登记的回调中,在接收到kCFStreamEventCanAcceptBytes 事件时开始发送数据或请求;
6) 数据传输完成,关闭和释放打开和创建的相关流;