CFStream 缓存
读写流以设备依赖的方式为交换数据提供了一个简单的途径。能够为内存中的数据、文件中的数据或网络上的数据(使用套接字)建立流,而不用把所有数据一次性读到内存中去。套接字流为经过套接字读写数据提供了一个简单易用的接口。每一个套接字均可以与输入流和输出流绑定,容许异步的通讯。CFStream包装了大部分读写字节流须要的工做,替换了C语言中传统的send和recv方法。CFSream对象包括两种类型:CFReadStream和CFWriteStream。网络
1.CFReadStream异步
它提供了一系列从套接字读取数据相关的方法,下面列出其中一些经常使用的函数。函数
(1)CFReadStreamOpen和CFReadStreamClose 打开和关闭一个读取流(read stream),分配或释放相关资源。读取流打开后,才能从中读取数据。oop
(2)CFReadStreamRead 从流中读取数据的函数,返回实际读取的字节数。这个方法会阻塞直到接收到数据。spa
(3)CFReadStreamGetBufer 返回指向读取流内部未读数据缓存区的指针。指针
(4)CFReadStreamGetStatus 返回读取流的当前状态。 orm
读取流的当前状态
kCFStreamStatusNotOpen(读取流没有被打开)对象
kCFStreamStatusOpening(读取流正在被打开)接口
kCFStreamStatusOpen(读取流已经被打开)
kCFStreamReading(正在对流执行读取操做)
kCFSreamStatusAtEnd(读取流中没有能够读取的数据)
kCFStreamStatusClosed(读取流已经被关闭)
kCFStreamStatusError(读取流的时候发生了错误)
(5)CFReadStreamHasBytesAvailable。
返回一个布尔值,表示是否存在数据能够不阻塞地读取。若是不经过实际读取操做函数没法肯定是否存在数据,则返回TRUE。
(6) CFReadStreamSheduleWithRunLoop和CFReadStreamUnscheduleFromRunLoop。
经过调用CFReadStreamSheduleWithRunLoop,指定run loop和run loop模式,使用CFReadStreamSetClient方法设置的回调函数在事件发生时会被调用。好比,在流被打开、有数据能够读取等事件发生时调用回调函数。使用 CFReadStreamUnscheduleFromRunLoop函数从run loop中移除。
(7)CFReadStreamSetClient。
设置回调函数在一些事件发生时被调用。回调函数的声明相似于以下所示。
void CallBackTest(
CFReadStreamRef stream,
CFStreamEventType eventType,
void *clientCallBackInfo
)
与CFSocket的回调函数相似,回调函数能够获得事件类型和相关的数据。事件类型的定义以下。
typedef enum
{
kCFStreamEventNone = 0,(没有事件发生)
kCFStreamEventOpenCompleted = 1,(流被成功打开)
kCFStreamEventHasBytesAvailable = 2,(有数据能够读取)
kCFStreamEventCanAcceptBytes = 4,(流能够接受写入数据(用于写入流))
kCFStreamEventErrorOccurred = 8(在流上有错误发生)
kCFStreamEventEndEncountered = 16 (到达了流的结束位置)
} CFStreamEventType;
2.CFWriteStream
CFWriteStream和CFReadStream相对应,它提供了向套接字流写入数据(发送数据)的方法。下面列出一些经常使用的函数。
(1)CFWriteStreamOpen和CFWriteStreamClose
打开和关闭一个写入流(write stream),分配或释放相关资源。写入流打开后,才能向其中写入数据。
(2)CFWriteStreamWrite
向流中写入数据的函数,返回实际发送的字节数。这个方法会阻塞,直到数据被发送完。
(3)CFWriteStreamStatus
返回写入流的当前状态,为如下几种。
kCFStreamStatusNotOpen(写入流没有被打开)
kCFStreamStatusOpening(写入流正在被打开)
kCFStreamStatusOpen(写入流已经被打开)
kCFStreamWriting(正在对流执行写入操做)
kCFStreamStatusAtEnd(没有数据能够向流中写入)
kCFStreamStatusClosed(写入流已经被关闭)
kCFStreamStatusError (写入流的时候发生了错误)
(4)CFWriteStreamCanAcceptBytes
返回一个布尔值,表示是否能够不阻塞地向流中写入数据。若是不经过实际写入操做函数没法肯定是否能够写入,则返回TRUE。
(5)CFWriteStreamSheduleWithRunloop 和 CFWriteStreamUnscheduleFromRunLoop
经过调用 CFWriteStreamSheduleWithRunloop ,指定run loop和run loop模式,使用CFWriteStreamSetClient方法设置的回调函数在事件发生时会被调用。好比,在流被打开、能够发送数据事件发生时调用回调函数。使用CFWriteStreamUnscheduleFromRunLoop函数从run loop中移出。
(6)CFWriteStreamSetClient
设置回调函数在一些事件发生时被调用。回调函数的声明相似于以下所示。
void CallBackTest (
CFWriteStreamRef stream,
CFStreamEventType eventType,
void *clientCallBackInfo
) ;
与CFSocket的回调函数相似,回调函数能够获得事件类型和相关的数据。