2012-07-28 107 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