【发布时间】:2012-07-28 08:22:42
【问题描述】:
我没有找到任何合适的文档来解释 NSStream 的线程处理过程。具体来说,让我们使用 NSInputStream。 Objective-C 中的线程对我来说目前是一个谜,因为它看起来很简单。
我的问题主要是指这一行:
[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 吗?
有什么想法吗?
【问题讨论】:
-
如果你创建了一个 NSThread,你也可以访问它拥有的 NSRunLoop。反过来也行不通,访问 NSRunLoop 不会为您创建 NSThread。如果您要求
currentRunLoop,您将获得您所在线程的运行循环。
标签: objective-c multithreading cocoa nsrunloop nsstream