CFStream
讀寫流以設備依賴的方式為交換數據提供了一個簡單的途徑。可以為內存中的數據、文件中的數據或網絡上的數據(使用套接字)創建流,而不用把全部數據一次性讀到內存中去。套接字流為通過套接字讀寫數據提供了一個簡單易用的接口。每個套接字都可以與輸入流和輸出流綁定,允許異步的通信。CFStream包裝了大部分讀寫字節流需要的工作,替換了C語言中傳統的send和recv方法。CFSream對象包括兩種類型:CFReadStream和CFWriteStream。
1.CFReadStream
它提供了一系列從套接字讀取數據相關的方法,下面列出其中一些常用的函數。
(1)CFReadStreamOpen和CFReadStreamClose 打開和關閉一個讀取流(read stream),分配或釋放相關資源。讀取流打開后,才能從中讀取數據。
(2)CFReadStreamRead 從流中讀取數據的函數,返回實際讀取的字節數。這個方法會阻塞直到接收到數據。
(3)CFReadStreamGetBufer 返回指向讀取流內部未讀數據緩存區的指針。
(4)CFReadStreamGetStatus 返回讀取流的當前狀態。
(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的回調函數類似,回調函數可以得到事件類型和相關的數據。