Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在等待NSStream响应时替换休眠调用_Objective C_Macos_Cocoa_Nsstream - Fatal编程技术网

Objective c 在等待NSStream响应时替换休眠调用

Objective c 在等待NSStream响应时替换休眠调用,objective-c,macos,cocoa,nsstream,Objective C,Macos,Cocoa,Nsstream,我制作了一个应用程序,它使用NSStream来建立到telnet服务器的连接。 建立连接后,我发送第一个命令。然后我使用sleep(1)使我的应用程序等待。然后发送第二个命令 问题是整个GUI在sleep()期间被卡住。我知道这不是一种“完美”的“暂停”方式,我想学习如何正确地暂停。我听说了关于NSTimer的好消息,但我想有一个具体的“简单”的方法来使用它,简单地取代我对sleep()的拙劣使用,你应该能够用你用来建立连接的任何过程注册某种回调。让代码等待回调,而不做任何事情 在这种情况下,使

我制作了一个应用程序,它使用
NSStream
来建立到telnet服务器的连接。 建立连接后,我发送第一个命令。然后我使用
sleep(1)使我的应用程序等待。然后发送第二个命令


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

的拙劣使用,你应该能够用你用来建立连接的任何过程注册某种回调。让代码等待回调,而不做任何事情

在这种情况下,使用
NSStream
,您需要:

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


您还必须设置一个委托对象(
[stream setDelegate:self];
,例如),该委托对象将使流具有要报告的内容。该委托必须实现
stream:handleEvent:
,调用时将引用流和指示发生了什么的代码。

您应该能够在用于建立连接的任何过程中注册某种回调。让代码等待回调,而不做任何事情

在这种情况下,使用
NSStream
,您需要:

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


您还必须设置一个委托对象(
[stream setDelegate:self];
,例如),该委托对象将使流具有要报告的内容。该代理必须实现
流:handleEvent:
,调用该流时将引用流和指示发生了什么的代码。

您如何建立连接?它不仅会使GUI无响应,还会(可能最终)使GUI崩溃。永远不要在Cocoa的主线程上执行睡眠操作(Cocoa touch的情况更是如此)@user:在iOS上,这不是崩溃,而是系统因为应用程序没有响应而杀死了你的应用程序。OSX不像iOS那样有看门狗定时器,应用程序可能会被暂停或无限期休眠。这就是说,你是对的,你不应该在iOS上使用
sleep()
,这是双重的。你是如何建立连接的?它不仅会使你的GUI没有响应,还会(可能最终)使你的GUI崩溃。永远不要在Cocoa的主线程上执行睡眠操作(Cocoa touch的情况更是如此)@user:在iOS上,这不是崩溃,而是系统因为应用程序没有响应而杀死了你的应用程序。OSX不像iOS那样有看门狗定时器,应用程序可能会被暂停或无限期休眠。也就是说,你是对的,一个人不应该使用
sleep()
,在iOS上更是如此。如此简单以至于我没有想到它!在输出流中发送下一个命令之前,我可以等待输入流中的“>”字符!这样我就有了“完美”的等待时间!谢谢你的光!:)太容易了,我都没想到!在输出流中发送下一个命令之前,我可以等待输入流中的“>”字符!这样我就有了“完美”的等待时间!谢谢你的光!:)
[stream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                  forMode:NSDefaultRunLoopMode];