Ho scritto un codice che sostituisce alcuni esistente:Qual è la differenza tra GCD Dispatch Sources e select()?
while(runEventLoop){
if(select(openSockets, readFDS, writeFDS, errFDS, timeout) > 0){
// check file descriptors for activity and dispatch events based on same
}
}
presa codice di lettura. Mi piacerebbe cambiarlo per usare una coda GCD, in modo che io possa far apparire gli eventi in coda usando dispatch_async invece di mantenere un array "deve essere chiamato sulla prossima iterazione". Inoltre sto già utilizzando una coda GCD per/contenere/questa particolare azione, quindi voglio delegarla a un modulo di invio GCD più naturale. (Non un ciclo while() monopolizzare una coda di serie)
Tuttavia, quando ho cercato di refactoring questo in una forma che si basava su fonti di invio sparato da gestori di eventi legati alla DISPATCH_SOURCE_TYPE_READ e DISPATCH_SOURCE_TYPE_WRITE sui descrittori di socket, il codice libreria che dipendeva da questa programmazione smesso di funzionare. La mia prima ipotesi è che io stia fraintendendo l'uso di DISPATCH_SOURCE_TYPE_READ e DISPATCH_SOURCE_TYPE_WRITE: ho pensato che avrebbero dato all'incirca lo stesso comportamento di chiamare select() con quei descrittori di socket.
Non capisco male le fonti di spedizione GCD? Oppure, riguardo al refactoring, lo sto usando in una situazione in cui non è più adatto?
Dovresti mostrare il codice: cosa hai provato. Nel frattempo, Mike Ash ha un codice di esempio da verificare - http://www.mikeash.com/svn/GCDWeb/GCDWeb.m - server Web GCD. – robertvojta