2012-01-30 74 views
2

我有一個連接打開的TCP連接,用於與外部設備進行通信。通信管道中有很多事情導致UI有時不響應。線程NSStream

我想將通信放在單獨的線程上。我瞭解detachNewThread以及它如何稱爲@selector。我的問題是,我不知道這將如何與NSStream之類的東西結合使用?

回答

2

您可能更喜歡使用Grand Central Dispatch('GCD'),而不是手動創建線程並管理線程安全問題。這允許你發佈塊 - 這是代碼包和一些狀態 - 離開主線程以及OS認爲最合適的地方。如果你創建了一個串行調度隊列,你甚至可以確定,如果你發佈一個新的塊,而舊的塊還沒有完成,系統會一直等到它完成。

E.g.

// you'd want to make this an instance variable in a real program 
dispatch_queue_t serialDispatchQueue = 
      dispatch_queue_create(
         "A handy label for debugging", 
         DISPATCH_QUEUE_SERIAL); 

... 

dispatch_async(serialDispatchQueue, 
^{ 
    NSLog(@"all code in here occurs on the dispatch queue ..."); 
}); 

/* lots of other things here */ 

dispatch_async(serialDispatchQueue, 
^{ 
    NSLog(@"... and this won't happen until after everything already dispatched"); 
}); 

... 

// cleanup, for when you're done 
dispatch_release(serialDispatchQueue); 

一個非常快速的介紹GCD is here,蘋果的more thorough introduction也值得一讀。

+0

好吧,我仍然有點困惑。 GCD方法仍然執行一段特定的代碼。要使用GCD將NSStream移動到後臺,我應該在dispatch_async中分配並初始化包裝NSStream的對象嗎? – user1178361 2012-01-30 22:24:58

+1

我認爲Tommy建議你將特定的NSStream事件(代理回調)作爲塊傳遞給GCD。正如Tommy所寫,如果您創建了一個串行調度隊列,GCD將確保在前一個塊完成執行之前不會執行新塊。 – 2012-04-19 13:15:40