在NSRunLoop上调度流

时间:2014-12-15 16:45:14

标签: ios sockets nsrunloop nsinputstream nsoutputstream

我一直在关注这个教程http://www.raywenderlich.com/3932/networking-tutorial-for-ios-how-to-create-a-socket-based-iphone-app-and-server,我的一切工作正常,但文字中有一行我不明白:

  

我们的流必须随时准备发送或接收数据。为了实现这一点,我们   必须安排流在运行循环中接收事件。如果我们不分配运行循环   委托将阻止我们的代码执行,直到流上没有数据要读或写,这是我们想要避免的情况。

但是,如果我在代码中评论这些行:

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

一切都会好起来的。我真的不明白为什么我必须在主要循环中安排这个?

正如我所看到的,主线程上发生的一切都在这个运行循环中处理。因此,如果按下按钮,它将在主运行循环中处理。如果我不在主运行循环上安排这个,那么仍然会收到并发送字节,所以对我来说这意味着它们是在主运行循环上进行的。

1 个答案:

答案 0 :(得分:1)

您可以在任何所需的runloop中安排流。 Delegate的回调方法将在调度它的线程中调用。例如,我为我的POSInputStreamLibrary编写了一些单元测试,其中我的委托在某个工作线程中接收事件。您可以查看日程安排流程here