2012-07-28 164 views
5

我還沒有找到任何體面的文檔來解釋NSStream的線程過程。具體來說,讓我們來看看NSInputStream。在Objective-C中對我進行線程處理目前是個謎,因爲它看起來很簡單。scheduleInRunLoop - 線程網絡連接

什麼,我的問題是指此行主要是:

[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

您可以指定運行的循環輸入流將運行,我認爲是很涼爽。問題是,如果我想讓輸入和輸出流在他們自己的線程中運行,並且都在單個類中實例化,比如說Connection,那麼如何讓它們在自己的線程中運行?

我問的原因是因爲代表。以前我們會完成[inputStream setDelegate:self]這意味着我們必須聲明stream:handleEvent來處理傳入/傳出的數據。因此,最終我的問題是,如果您有一個類設置輸入和輸出流,那麼您如何將每個流都線程化並將處理流事件的責任委派給當前類?

下面是一些代碼來對終日啃食:

[inputStream setDelegate:self]; 
[outputStream setDelegate:self]; 
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[inputStream open]; 
[outputStream open]; 

我想以下幾點:

  • 您不能委派在當前類兩個線程的責任,你必須委託來分離對象。
  • 一個線程會爲兩個流做? (我個人不這麼認爲,因爲輸入/輸出將同時運行)
  • 我在想這個錯誤,你可以創建一個單獨的運行循環,並調用scheduleRunLoop針對一些單獨的線程?

任何想法?

回答

-3
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode 
{ 
    switch (eventCode) { 
     case NSStreamEventNone: 
      break; 
     case NSStreamEventOpenCompleted: 
      break; 
     case NSStreamEventHasBytesAvailable: 
      [self _readData]; 
      break; 
     case NSStreamEventHasSpaceAvailable: 
      [self _writeData]; 
      break; 
     case NSStreamEventErrorOccurred: 
      break; 
     case NSStreamEventEndEncountered: 
      break; 
     default: 
      break; 
    } 
} 
+6

-1只是代碼不是答案。你必須解釋它。即使只是一些關於你爲什麼要做你正在做的事情的解釋。 – Fogmeister 2014-02-11 15:45:58

+1

有點解釋會很好。我強迫自己不要低估這一點.. – 2015-06-25 21:17:49