我一直在寫一些代碼,取代一些現有的:GCD Dispatch Sources和select()有什麼區別?
while(runEventLoop){
if(select(openSockets, readFDS, writeFDS, errFDS, timeout) > 0){
// check file descriptors for activity and dispatch events based on same
}
}
插座識別代碼。我想將其改爲使用GCD隊列,以便我可以使用dispatch_async將事件彈出到隊列中,而不是維護「必須在下一次迭代時調用」數組。我也已經使用GCD隊列來包含/包含這個特定的動作,因此想要將它轉換爲更自然的GCD調度表單。 (不是while()循環壟斷串行隊列)
然而,當我試圖重構成依靠調度來源從綁DISPATCH_SOURCE_TYPE_READ和DISPATCH_SOURCE_TYPE_WRITE的插座描述符,庫代碼的事件處理程序發射的形式這一點,依靠這個調度停止工作。我的第一個假設是我誤解了DISPATCH_SOURCE_TYPE_READ和DISPATCH_SOURCE_TYPE_WRITE的使用 - 我曾假設他們會產生與使用這些套接字描述符調用select()大致相同的行爲。
我是否誤解GCD調度源?或者,關於重構,我是否在最不適合的情況下使用它?
你應該顯示你的代碼 - 你做了什麼。與此同時,Mike Ash有一些示例代碼可以檢查 - http://www.mikeash.com/svn/GCDWeb/GCDWeb.m - GCD Web服務器。 – robertvojta 2011-02-26 16:35:14