2012-05-14 62 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

很高興我能幫到你。 –