2012-08-24 106 views
0

我是Objective C中的新手。我有一個對象,它通過GCD與默認隊列中的dispatch_async創建新線程。 我在線程中使用timeout = 1sec的dispatch_semaphore_wait來檢查何時需要關閉此線程。等到dispatch_async線程結束

當我調用「close」方法時,它發送dispatch_semaphore_signal並關閉線程。但有時線程會在「關閉」方法結束後的一段時間內生效。我怎麼能等到我的「關閉」方法,直到線程結束?

Thx。

+0

好吧,我找到了[解決]爲什麼你想要(http://www.fieryrobot.com/blog/2010/06/27/a-simple-job-queue-with-grand-central-dispatch/) –

+1

手動管理線程? GCD的原因是爲了避免管理線程 –

回答

3

典型的回答這樣一個問題:你想要做什麼?

我問這個是因爲,首先,你應該也不需要知道或關心,有一個線程支持一個GCD請求,並將其退出時 - 這完全取決於GCD管理。其次,你應該總是懷疑使用顯式超時的代碼(除了「FOREVER」)。如果你有任何理由問自己「爲什麼1秒?如果我等待的任何事件需要比這更多或更少的時間會發生什麼?」那麼你正在參與導致投票的那種想法,並且投票只是寫了某些設備驅動程序的幾乎所有東西都是壞的(邪惡的,錯誤的)設計!

一個更合理的方法是在操作結束時使用完成回調函數來表示完成回調,採用完全異步的方法編程,並在此過程中遵循GCD的基本設計原則之一。

聽起來對我來說,我只是猜測,你正在採取現有的編程範式或思維方式,並將其錯誤地應用於GCD。一個可以理解的錯誤,但卻是一個錯誤。

+0

我使用此線程來控制套接字連接。如果上次從套接字讀取的時間超過N秒,則向服務器發送保持活動消息。即這個線程檢查對象的字段,如果需要的話,發送消息。我認爲這可能是另一個問題,線程檢查數據不在主隊列中。 –

+0

除了跟蹤線程之外,還有很多其他方法可以實現此目的。你可以有一個單獨的定時器源,例如,由讀取器塊創建/取消。如果定時器源觸發,它將發送保持活動狀態。如果在此之前發生讀取,則讀取器重置定時器源。 – jkh