В чем разница между 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? Или, что касается рефакторинга, я использую его в ситуации, когда он не подходит?

13
задан Brad Larson 19 December 2011 в 19:09
поделиться