iOS 網絡編程(二)

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的回調函數相似,回調函數能夠獲得事件類型和相關的數據。

相關文章
相關標籤/搜索