1. 程式人生 > >ios開發之從輸入流裡讀入資料

ios開發之從輸入流裡讀入資料

文章來自:http://blog.csdn.net/caryaliu/article/details/7640197

ios cocoa 程式設計,從NSInputStream中讀入資料包括幾個步驟:

1.從資料來源建立和初始化一個NSInputStream例項

2.將輸入流物件配置到一個run loop,open the stream

3. 通過流物件的delegate函式處理事件

4. 當所有資料讀完,進行流物件的記憶體處理

一,使用流物件的準備工作

在使用NSInputStream物件之前你必須有流的資料來源,資料來源的型別可以是檔案,NSData物件,或者一個網路套接字。

NSInputStream的初始化函式和工廠方法可以從NSData和檔案建立和初始化一個NSInputStream的例項。下面的例子是從檔案建立一個NSInputStream的例項:


[cpp] view plain copy  print?
  1. - (void)setUpStreamForFile:(NSString *)path {  
  2.     // iStream is NSInputStream instance variable
  3.     iStream = [[NSInputStream alloc] initWithFileAtPath:path];  
  4.     [iStream setDelegate:self];  
  5.     [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]  
  6.         forMode:NSDefaultRunLoopMode];  
  7.     [iStream open];  
  8. }  
上面的例子顯示,當你建立物件之後你應該設定其delegate。當把NSInputStream物件配置到一個run loop,並且有與流相關的事件(例如流中有可讀資料)發生時,該物件會收到stream:handleEvent:訊息。

在你open stream之前,給流物件傳送一個scheduleInRunLoop:forMode:訊息,來將該物件配置到一個run loop接收stream events。這樣,當流中沒有資料可讀時可以避免delegate阻塞。如果流是發生在另一個執行緒,你需要確認該流物件是配置在那個執行緒的run loop中。你不應該嘗試從一個除了包含該流物件的run loop的執行緒的其他執行緒中對流進行操作。最後,對NSInputStream物件傳送open訊息開始對輸入資料的流操作。

二,處理Stream Events

當你對一個流物件傳送open訊息之後,你可以查詢到它的當前狀態。通過下面的訊息可以知道流物件中是否有資料可讀,以及任何錯誤的屬性:

  • streamStatus

  • hasBytesAvailable

  • streamError

返回的狀態是一個NSStreamStatus常量,它可以指示流物件是處於opening,reading,或者at the end of the stream等等。返回的錯誤是一個NSError物件,它封裝了可能發生的所有錯誤資訊。

重要的是,一旦 open 流物件,流物件會一直向其delegate傳送stream:handleEvent: 訊息直到到達了流物件的末尾。這些訊息的引數中包含一個指示流事件型別的NSStreamEvent常量。對NSInputStream物件而言,最常用的事件型別是NSStreamEventOpenCompleted,NSStreamEventHasBytesAvailable,NSStreamEventEndEncountered。我們尤其感興趣的應該是NSStreamEventHasBytesAvailable事件。下面的例子就是一個處理NSStreamEventHasBytesAvailable事件的好的方法:

[cpp] view plain copy  print?
  1. - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {  
  2.     switch(eventCode) {  
  3.         case NSStreamEventHasBytesAvailable:  
  4.         {  
  5.             if(!_data) {  
  6.                 _data = [[NSMutableData data] retain];  
  7.             }  
  8.             uint8_t buf[1024];  
  9.             unsigned int len = 0;  
  10.             len = [(NSInputStream *)stream read:buf maxLength:1024];  
  11.             if(len) {  
  12.                 [_data appendBytes:(constvoid *)buf length:len];  
  13.                 // bytesRead is an instance variable of type NSNumber.
  14.                 [bytesRead setIntValue:[bytesRead intValue]+len];  
  15.             } else {  
  16.                 NSLog(@"no buffer!");  
  17.             }  
  18.             break;  
  19.         }  
  20.         // continued
  21. }  

stream:handleEvent: 函式使用switch語句來判別NSStreamEvent常量,當這個常量是MSStreamEventHasBytesAvailable的時候,delegate函式會lazy create 一個NSMutableData物件_data來接收讀取的資料。然後宣告一個大小為1024的uint8_t型別陣列buf,呼叫read:maxLength:函式從stream中讀取指定大小的資料到buf中,如果讀取成功,delegate將會將讀取到的資料新增到NSMutableData物件_data中,並且更新總的讀取到的資料bytesRead.

至於一次從stream中讀取多大的資料,一般來說,使用一些常用的資料大小規格,比如說512Bytes,1kB,4kB(一個頁面大小)。

三,處理stream object

當NSInputStream物件到達steam的末尾的時候,它會向stream:handleEvent:函式傳送一個NSStreamEventEndEncountered事件型別常量,delegate函式應該做出與準備使用流物件相反的操作,也就是說,需要關閉流物件,從run loop中移除,最終釋放流物件。如下面的程式碼所示:

[cpp] view plain copy  print?
  1. - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode  
  2. {  
  3.     switch(eventCode) {  
  4.         case NSStreamEventEndEncountered:  
  5.         {  
  6.             [stream close];  
  7.             [stream removeFromRunLoop:[NSRunLoop currentRunLoop]  
  8.                 forMode:NSDefaultRunLoopMode];  
  9.             [stream release];  
  10.             stream = nil; // stream is ivar, so reinit it
  11.             break;  
  12.         }  
  13.         // continued ...
  14.     }  
  15. }  

相關推薦

ios開發輸入資料

文章來自:http://blog.csdn.net/caryaliu/article/details/7640197 ios cocoa 程式設計,從NSInputStream中讀入資料包括幾個步驟: 1.從資料來源建立和初始化一個NSInputStream例項

[譯]ios開發輸入資料

ios cocoa 程式設計,從NSInputStream中讀入資料包括幾個步驟: 1.從資料來源建立和初始化一個NSInputStream例項 2.將輸入流物件配置到一個run loop,open the stream 3. 通過流物件的delegate函式處理

ios開發向輸出資料

使用NSOutputStream例項需要以下幾個步驟: 1,使用儲存寫入資料的儲存庫建立和初始化一個NSOutputSteam例項,並且設定它的delegate。 2,將這個流物件佈置在一個runloop上並且open the stream。 3,處理流物件向其delegate傳送的事件訊息。 4

iOS開發將字典NSDictionary轉化為NSData資料

NSDictionary *dic= @{@"name":@"zero",@"age":@(25)}; NSData *data= [NSJSONSerialization dataWithJSONO

Unity3D TEXT 檔案陣列

參考     改得如下程式 FileName.txt 0,1,16,1,1,0 1,1,16,0,0,0 2,1,16,0,0,0 3,1,16,0,1,0 4,1,16,0,0,11 5,1,1

c/c++ 鍵盤字串的函式:gets(str);

****本文摘自西電論壇 標頭檔案:#include <stdio.h> gets()函式用於從緩衝區中讀取字串,其原型如下:    char *gets(char *string);gets()函式從流中讀取字串,直到出現換行符或讀到檔案尾為止,最後加上NUL

用pythontxt檔案中資料

現在有如下資料集儲存在txt檔案中,利用python逐行讀取資料到list型別下。 1.658985 4.285136 -3.453687 3.424321 4.838138 -1.151539 -5.379713 -3.362104 0.972564

ORACLE 中寫入txt文字與Txt檔案中資料 修改表結構

--建立一個表 DROP TABLE TEST CASCADE CONSTRAINTS ; CREATE TABLE TEST(A VARCHAR(30),B VARCHAR(30)); --檢視具體的許可權 SELECT DISTINCT PRIVILEGE FROM D

iOS開發如何優雅的替換工程所有的系統彈框UIAlertView,UIActionSheet,UIAlertController 的原理

現在又要替換UIAlertView和UIActionSheet UIActionSheet使用的不多,按照系統的屬性方法名,重新定義一個類 實現一下就好,和UISwitch那個類似。 這裡以UIAlertView為例,因為它使用的特別多,直接在工程裡能搜到500多個,

iOS開發窺探UICollectionViewController(三) :使用UICollectionView自定義瀑布

上篇部落格的例項是自帶的UICollectionViewDelegateFlowLayout佈局基礎上來做的Demo, 詳情請看《iOS開發之窺探UICollectionViewController(二) –詳解CollectionView各種回撥》。UICollectionV

iOS開發窺探UICollectionViewController(四) --一款功能強大的自定義瀑布

在上一篇部落格中,自定義瀑布流的列數,Cell的外邊距,Cell的最大以及最小高度是在我們的佈局檔案中是寫死的,換句話說也就是不可配置的。為了循序漸進,由淺入深呢,上篇部落格暫且那麼寫。不過那樣寫太過死板,本來使用起來比較靈活的自定義佈局,如果把其配置引數給寫死了,就相當於在籠

IOS開發瀑布照片牆實現

想必大家已經對網際網路傳統的照片佈局方式司空見慣了,這種行列分明的佈局雖然對使用者來說簡潔明瞭,但是長久的使用難免會產生審美疲勞。現在網上流行一種叫做“瀑布流”的照片佈局樣式,這種行與列參差不齊的狀態著實給使用者眼前一亮的感覺,這種不規則的方式也吸引著我,現在我們就來一起實

IOS開發非同步載入網路圖片並快取本地實現瀑布(一)

</pre><pre name="code" class="objc"></pre><pre name="code" class="objc">在前面的一篇部落格中,我寫了一個瀑布流照片牆的程式,由於之前的程式載入的圖片是本

IOS開發新增第三方lib或其他工程引入lib時的連結錯誤:ld: symbol(s) not found for architecture i386

首先要確保正確的新增步驟 1)拷貝到新project目錄下 2)新增到工程裡 3)在新工程的targets->Build Phases->target dependencies 點選+ 新增lib 3) 在新工程的targets->Summary->

iOS開發執行時程式設計(Runtime Programming)淺

  什麼是執行時(Objective-C runtime)?       簡單的來說,Objective-C runtime是一個實現 Objective-C語言的庫。物件可以用C語言的結構體表示,而方法(methods) 可以用C函式實現。       事實上,他們也差不

iOS開發實時監測textField輸入變化

// 我這裡控制的是輸入使用者名稱和密碼長度控制,通過這個來設定登入按鈕能不能點選 [self.accountText addTarget:self action:@selector(textFieldDidChange:) forControlEvents:

iOS開發限制只輸入數字和字母

首先,根據需求,定義一個巨集: #define NUM @"0123456789"//只輸入數字 #define ALPHA @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"//只輸入字母 #def

iOS開發_一個帶有空格和特殊符號的字串提取數字即手機號的方法

最近做呼叫手機通訊錄,有的號碼調取之後會有空格或者“-”和“+86”等特殊符號,先把“+86”替換成“”,然後在剩下的字串使用如下方法,即可提取數字及手機號; 替換“+86”方法: truePhone = [phoneStr stringByReplacingOccurre

Android NDK開發環境搭建到Demo級十步

寫在正文之前: 幾個月沒有更新部落格,感覺有點生疏了,所以說不能斷,一斷人就懶。 其實這幾個月也並不是什麼事也沒有做,俺可是時刻想著今年的任務呢,10本書,30篇博文…,這幾個月間斷性的也是在學習中,學H5,學設計模式,以及NDK JNI開發等等。 學習J

ios開發 -- invalid nib registered for identifier

層級關系 註意 刪除 出現 ide 提示 sta tab 後來 今天在寫代碼的時候,碰到這麼一個問題: invalid nib registered for identifier (重用符) - nib must contain exactly one top level