2012-05-14 43 views
1

我做了一个应用程序,它使用NSStream来建立与telnet服务器的连接。 建立连接时,我发送第一个命令。然后我使用sleep(1);来让我的应用程序等待。然后发送第二个命令。在等待NSStream响应时替换呼叫进入睡眠

问题是在sleep()期间整个GUI卡住了。我知道这不是“完美”的方式来做一个“暂停”,我想学习如何正确的。我听到有关NSTimer的好消息,但是我想用一种具体而“简单”的方式来使用它,以简单地替换我使用不当的sleep()

+0

你是如何进行连接的? –

+0

通过打开NSStream – Nono

+0

它不仅会使GUI不响应,而且可能(也可能最终会)使您的GUI崩溃。不要在Cocoa的主线程中执行睡眠(对于Cocoa触摸来说是双重的) – user439407

回答

1

您应该可以使用您用来建立连接的任何程序注册某种回调。只要让你的代码等待这个回调而不做任何事情。

在这种情况下,使用NSStream,你需要schedule the stream on the run loop

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

运行循环是处理事件,您的应用程序的结构。当您使用sleep()时,它会停止,并且您的GUI无法执行任何操作。通过将流作为输入添加到运行循环中,您可以让它们继续工作。

您还必须设置一个代表对象([stream setDelegate:self];,例如),这将有recieve notifications when该流有东西要报告。该代表必须实施stream:handleEvent:,将通过引用流和代码来指示发生的事情。

+0

太容易了,我没有想到它!在发送输出流中的下一个命令之前,我可以等待输入流中的“>”字符!通过这种方式,我将拥有“完美”的等待时间!谢谢你的光! :) – Nono

+0

很高兴我能帮到你。 –