Подтвердить что ты не робот

В чем разница между 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. Я предположил, что они будут давать примерно то же поведение, что и call select() с этими дескрипторами сокетов.

Я неправильно понимаю источники отправки GCD? Или, что касается рефакторинга, я использую его в ситуации, когда он не подходит?

4b9b3361

Ответ 1

Короткий ответ на ваш вопрос: none. Нет никаких различий, как источники отправки GCD, так и select() делают то же самое: они уведомляют пользователя о том, что произошло конкретное событие ядра или что выполняется конкретное условие.

Обратите внимание, что на устройстве Mac или iOS вы не должны использовать select(), а более продвинутые kqueue() и kevent() (или kevent64()).

Вы можете, конечно, конвертировать код, чтобы использовать источники отправки GCD, но вам нужно быть осторожным, чтобы не нарушить другой код, основанный на этом. Таким образом, для этого требуется полная проверка всех сигналов обработки кода, дескрипторов файлов, сокетов и всех других событий ядра низкого уровня.

Может быть, более простым решением может быть поддержка исходного кода, просто добавив код GCD в часть, которая реагирует на события. Здесь вы отправляете события в разных очередях в зависимости от конкретного типа события.