Вопрос по asynchronous, ios, objective-c – Выполните в следующем цикле выполнения: что не так с GCD?

26

Я пробую эти два подхода:

dispatch_async(dispatch_get_main_queue(),^{
    [self handleClickAsync];
});

а также

[self performSelector:@selector(handleClickAsync) withObject:nil afterDelay:0];

в ответ на нажатие кнопки.

Второй позволяетUIButton выделить, как и следовало ожидать, и выполнитьhandleClickAsync в следующем цикле выполнения (я полагаю: «некоторое время спустя» наверняка). Первое не позволяетUIButton экземпляр загорается, пока операция не будет полностью выполнена.

Как правильно сделать это с помощью GCD, илиperformSelector все еще единственный способ?

Я не уверен. Я звоню прямо изtouchesEnded, который приходит бесплатно наUIView подкласс (или UIButton в этом случае). Dan Rosenstark
Я не уверен, почему вы устанавливаете связь между dispatch_async и запуском runloop ... Paul.s
Да, но я думал, что GCD только что запланировал задачу в очереди. Я не думаю, что он заботится о том, чтобы завершить runloop. Если это нужно сделать асинхронным, то почему бы не запустить фоновую очередь и не перезвонить в основную очередь по завершении? Paul.s
@ Paul.s Я предполагаю, что до тех пор, пока runloop не завершится, UIButton не сможет завершить обновление своего материала. Это не правильно? Dan Rosenstark
Предположительно, вы звоните из другой очереди отправки? Если это так, он будет запускать все команды последовательно в очереди. Можно ли вызвать этот метод перед началом операции? Mark Armstrong

Ваш Ответ

2   ответа
38

обсуждение основной очереди рассылки:

This queue works with the application’s run loop (if one is present) to interleave the execution of queued tasks with the execution of other event sources attached to the run loop.

Другими словами, основная очередь отправки настраивает вторичную очередь (наряду со стандартной очередью событий, предоставляемойUIApplicationMain() для обработки блоков, отправленных в основную очередь. Когда блоки присутствуют в очереди, цикл выполнения будет чередовать снятие задач с основной очереди событий и очереди отправки. С другой стороны,ссылка дляdelay параметр-performSelector:withObject:afterDelay: отмечает, что:

Specifying a delay of 0 does not necessarily cause the selector to be performed immediately. The selector is still queued on the thread’s run loop and performed as soon as possible.

Таким образом, когда вы используете селектор выполнения, операция ставится в очередь в конце основной очереди событий и не будет выполняться до тех пор, пока в очереди не окажется все, что находится перед ней (предположительно, включая код для невыделенияUIButton) обработан. Однако, когда вы используете основную очередь отправки, он добавляет блок во вторичную очередь, которая затем, вероятно, обрабатывается немедленно (т. Е. В следующем цикле выполнения), предполагая, что в основной очереди нет других блоков. В этом случае код для отмены выделения кнопки все еще находится в основной очереди событий, в то время как цикл выполнения обрабатывает событие из очереди вторичных блоков.

Error: User Rate Limit Exceeded Dan Rosenstark
Error: User Rate Limit Exceeded Dan Rosenstark
25

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
     //bla bla bla
}];
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы