Runloop не обрабатывает события из dispatch_async - PullRequest
0 голосов
/ 08 января 2012

У меня проблемы с использованием dispatch_async.В главном потоке приложений / пользовательском интерфейсе я вызываю dispatch_async в глобальной очереди и приказываю ему выполнить какой-либо вызов функции с обработчиком завершения.Я ожидаю, что обработчик завершения будет вызван, но иногда он не появляется.

dispatch_queue_t hiq = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_async(hiq, ^(void){
            [object doSomethingAndThenCompletionHandler:^(){
                //Do some stuff because I'm done
            }];
        });

Что интересно, я делаю это в ответ на controlTextDidChange всякий раз, когда я набираю что-то в текстовое поле. Когда я щелкаю из текстового поля, все обработчики завершения запускаются сразу.

Я предполагаю, что все мои обработчики завершения попадают в очередь за чем-то в цикле выполнения, а затемкогда мой элемент интерфейса теряет фокус, это освобождает очередь.Мне не хватает эксперта по циклам выполнения, чтобы знать, что именно происходит, когда я набираю текстовое поле или комбинированный список, но, возможно, он связывает цикл запуска?

РЕДАКТИРОВАТЬ: я думаю, что это связано срежим цикла выполнения, потому что когда я распечатываю режим цикла выполнения, он печатается как NULL, за исключением обработчика завершения, когда он выводится как режим по умолчанию.Я использую поле со списком, и проблема возникает только тогда, когда поле со списком открыто и раскрыто. UIScrollView блокирует цикл выполнения? Я думаю, что это может быть связано с этой проблемой.Что вы, ребята, думаете?

Ответы [ 2 ]

1 голос
/ 08 января 2012

Когда вы делаете [[NSRunLoop currentRunLoop] runUntilDate:fiveSecondsFromNow], он рекурсивно входит в цикл выполнения, и цикл выполнения обрабатывает события в обычном режиме. Так что он вызовет ваш метод снова, если в текстовое поле поступит другое событие. Трассировка стека будет выглядеть примерно так (с гораздо большим количеством кадров, связанных с NSRunLoop):

main
NSApplicationMain
-[NSRunLoop runUntilDate:]
your method
-[NSRunLoop runUntilDate:]
your method

Понятия не имею, почему вы звоните runUntilDate:, но это, вероятно, не по уважительной причине.

Если вам нужна помощь в понимании того, почему ваш обработчик завершения не вызывается, вам нужно показать нам определение вашего doSomethingAndThenCompletionHandler: метода.

0 голосов
/ 08 января 2012

Разобрался с вопросом, думаю. Некоторые из библиотек, которые я использую, скорее всего, отправляют NSURLConnections без планирования работы в обычных режимах цикла выполнения. Когда поле со списком открыто, режим цикла выполнения переключается в режим отслеживания событий и затем не может получать обратные вызовы для них.

...