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