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