2
我有一個連接打開的TCP連接,用於與外部設備進行通信。通信管道中有很多事情導致UI有時不響應。線程NSStream
我想將通信放在單獨的線程上。我瞭解detachNewThread
以及它如何稱爲@selector
。我的問題是,我不知道這將如何與NSStream
之類的東西結合使用?
我有一個連接打開的TCP連接,用於與外部設備進行通信。通信管道中有很多事情導致UI有時不響應。線程NSStream
我想將通信放在單獨的線程上。我瞭解detachNewThread
以及它如何稱爲@selector
。我的問題是,我不知道這將如何與NSStream
之類的東西結合使用?
您可能更喜歡使用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也值得一讀。
好吧,我仍然有點困惑。 GCD方法仍然執行一段特定的代碼。要使用GCD將NSStream移動到後臺,我應該在dispatch_async中分配並初始化包裝NSStream的對象嗎? – user1178361 2012-01-30 22:24:58
我認爲Tommy建議你將特定的NSStream事件(代理回調)作爲塊傳遞給GCD。正如Tommy所寫,如果您創建了一個串行調度隊列,GCD將確保在前一個塊完成執行之前不會執行新塊。 – 2012-04-19 13:15:40