Я пишу код, который заменяет некоторые существующие:
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 для /contain/ этого конкретного действия, поэтому хочу перевести его в более естественную форму отправки GCD. (не цикл while(), монополизирующий последовательную очередь)
Однако, когда я попытался преобразовать это в форму, которая полагалась на источники отправки, запускаемые обработчиками событий, привязанными к DISPATCH_SOURCE_TYPE_READ и DISPATCH_SOURCE_TYPE_WRITE в дескрипторах сокетов, код библиотеки, который зависел от этого планирования, перестал работать. Мое первое предположение состоит в том, что я неправильно понимаю использование DISPATCH_SOURCE_TYPE_READ и DISPATCH_SOURCE_TYPE_WRITE — я предполагал, что они будут давать примерно то же поведение, что и вызов select() с этими дескрипторами сокетов.
Я неправильно понимаю источники отправки GCD? Или, что касается рефакторинга, я использую его в ситуации, когда он не подходит лучше всего?