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的例項:
- - (void)setUpStreamForFile:(NSString *)path {
- // iStream is NSInputStream instance variable
- iStream = [[NSInputStream alloc] initWithFileAtPath:path];
- [iStream setDelegate:self];
- [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
-
forMode:NSDefaultRunLoopMode];
- [iStream open];
- }
在你open stream之前,給流物件傳送一個scheduleInRunLoop:forMode:訊息,來將該物件配置到一個run loop接收stream events。這樣,當流中沒有資料可讀時可以避免delegate阻塞。如果流是發生在另一個執行緒,你需要確認該流物件是配置在那個執行緒的run loop中。你不應該嘗試從一個除了包含該流物件的run loop的執行緒的其他執行緒中對流進行操作。最後,對NSInputStream物件傳送open訊息開始對輸入資料的流操作。
二,處理Stream Events
當你對一個流物件傳送open訊息之後,你可以查詢到它的當前狀態。通過下面的訊息可以知道流物件中是否有資料可讀,以及任何錯誤的屬性:
-
streamStatus
-
hasBytesAvailable
-
streamError
重要的是,一旦
open 流物件,流物件會一直向其delegate傳送stream:handleEvent:
訊息直到到達了流物件的末尾。這些訊息的引數中包含一個指示流事件型別的NSStreamEvent常量。對NSInputStream物件而言,最常用的事件型別是NSStreamEventOpenCompleted,NSStreamEventHasBytesAvailable,NSStreamEventEndEncountered。我們尤其感興趣的應該是NSStreamEventHasBytesAvailable事件。下面的例子就是一個處理NSStreamEventHasBytesAvailable事件的好的方法:
- - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
- switch(eventCode) {
- case NSStreamEventHasBytesAvailable:
- {
- if(!_data) {
- _data = [[NSMutableData data] retain];
- }
- uint8_t buf[1024];
- unsigned int len = 0;
- len = [(NSInputStream *)stream read:buf maxLength:1024];
- if(len) {
- [_data appendBytes:(constvoid *)buf length:len];
- // bytesRead is an instance variable of type NSNumber.
- [bytesRead setIntValue:[bytesRead intValue]+len];
- } else {
- NSLog(@"no buffer!");
- }
- break;
- }
- // continued
- }
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?- - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
- {
- switch(eventCode) {
- case NSStreamEventEndEncountered:
- {
- [stream close];
- [stream removeFromRunLoop:[NSRunLoop currentRunLoop]
- forMode:NSDefaultRunLoopMode];
- [stream release];
- stream = nil; // stream is ivar, so reinit it
- break;
- }
- // continued ...
- }
- }
相關推薦
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
用python從txt檔案中讀入資料
現在有如下資料集儲存在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