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