我做了一個應用程序,它使用NSStream
來建立與telnet服務器的連接。 建立連接時,我發送第一個命令。然後我使用sleep(1);
來讓我的應用程序等待。然後發送第二個命令。在等待NSStream響應時替換呼叫進入睡眠
問題是在sleep()
期間整個GUI卡住了。我知道這不是「完美」的方式來做一個「暫停」,我想學習如何正確的。我聽到有關NSTimer
的好消息,但是我想用一種具體而「簡單」的方式來使用它,以簡單地替換我使用不當的sleep()
。
我做了一個應用程序,它使用NSStream
來建立與telnet服務器的連接。 建立連接時,我發送第一個命令。然後我使用sleep(1);
來讓我的應用程序等待。然後發送第二個命令。在等待NSStream響應時替換呼叫進入睡眠
問題是在sleep()
期間整個GUI卡住了。我知道這不是「完美」的方式來做一個「暫停」,我想學習如何正確的。我聽到有關NSTimer
的好消息,但是我想用一種具體而「簡單」的方式來使用它,以簡單地替換我使用不當的sleep()
。
您應該可以使用您用來建立連接的任何程序註冊某種回調。只要讓你的代碼等待這個回調而不做任何事情。
在這種情況下,使用NSStream
,你需要schedule the stream on the run loop:
[stream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
運行循環是處理事件,您的應用程序的結構。當您使用sleep()
時,它會停止,並且您的GUI無法執行任何操作。通過將流作爲輸入添加到運行循環中,您可以讓它們繼續工作。
您還必須設置一個代表對象([stream setDelegate:self];
,例如),這將有recieve notifications when該流有東西要報告。該代表必須實施stream:handleEvent:
,將通過引用流和代碼來指示發生的事情。
太容易了,我沒有想到它!在發送輸出流中的下一個命令之前,我可以等待輸入流中的「>」字符!通過這種方式,我將擁有「完美」的等待時間!謝謝你的光! :) – Nono
很高興我能幫到你。 –
你是如何進行連接的? –
通過打開NSStream – Nono
它不僅會使GUI不響應,而且可能(也可能最終會)使您的GUI崩潰。不要在Cocoa的主線程中執行睡眠(對於Cocoa觸摸來說是雙重的) – user439407