scheduleInRunLoop - 线程网络连接

Kez*_*zer 6 cocoa multithreading objective-c nsstream nsrunloop

我没有找到任何可以解释NSStream线程化过程的文档.具体来说,让我们去NSInputStream.在Objective-C中对我的线程目前是一个谜,因为它看起来如此简单.

我的问题主要是指这一行:

[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
Run Code Online (Sandbox Code Playgroud)

您可以指定输入流将运行的运行循环,我认为这很酷.问题是,如果我希望输入和输出流在他们自己的线程中运行,并且两者都在单个类中实例化,比如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];
Run Code Online (Sandbox Code Playgroud)

我在想以下几点:

  • 您不能委派当前类中的两个线程的责任,您必须委托给单独的对象.
  • 一个线程可以为两个流做什么?(我个人并不这么认为,因为输入/输出会同时运行)
  • 我认为这是错误的,你可以创建一个单独的运行循环并调用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • -1 仅仅代码并不能解决问题。你必须解释一下。即使只是一点关于你为什么要做你正在做的事情的解释。 (6认同)