2012-05-31 26 views
0

今天我測試了我在兩個不同的控制器中構建的項目,一個ViewController和一個TCPController。我的ViewController實例化了更新輸出和輸入流的TCPController(單例)。現在在測試中,我可以確定在GUI界面上有一些滯後,這很容易責怪TCPController。在iOS中對TCP控制器進行線程編程

是否有之前我用的是標準教程蘋果網站,如何將線穿入TCP控制器(客戶端)最佳實踐:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html

例如在如何做到這一點解決的是非常受歡迎的。

+1

除非你真的想重新建立一個TCP管理器對象,羅比·漢森擁有一支優秀的和廣泛使用的一種叫做CocoaAsyncSocket我強烈建議: https://github.com/robbiehanson/CocoaAsyncSocket。至少你應該看看它是如何完成這種事情的。要特別注意較新的GCD實施。 –

+0

我想我會在夏季假期重構我的代碼到這個asyncsocket ..謝謝你的loink .. – JavaCake

回答

1

閱讀文檔總是一個好主意。

你的工作部分取決於你的溝通框架。大多數優秀的框架已經提供了異步方法。如果你的不。尋找別的東西。

禁止,一般來說,你會想要在後臺線程中執行你的代碼。如果它是一個長期的工作,那麼下面應該做的伎倆......

dispatch_queue_t commQ = dispatch_queue_create("some.unique.labe", 0); 
dispatch_async(commQ, ^{ 
    // Now, any code running in this block is running in a different thread. 
    // When you get done, and want to talk to the UI, you must use the main 
    // queue for any UIKit calls... 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Now this code is running on the main queue 
     // Do all your UI stuff here... 

    }); 
}); 
dispatch_release(commQ); 
+0

我有一個按鈕,創建一些連續的數據,直接發送到outputStream ..它不完全得到一個機會在我釋放按鈕之前正確發送它們。按住並移動輸入時,它會滯後。所以我認爲我需要在線程中調用我的函數,如果可能的話?我現在正在使用'action @ selector'。 – JavaCake

+0

是的,在按鈕動作中,分離一個異步任務來完成這項工作。它會立即返回,並且當數據準備就緒時(或者在各種數據準備好的時候),只需在主隊列中運行的塊中運行UI代碼即可。 –

+0

我試着快速插入代碼並填充'dispatch_async(commQ,^ {'與我的代碼,實際上給出了和以前一樣的結果。是否沒有辦法讓outputStream在其任務中永久運行? – JavaCake