我正在尝试这两种方法:
dispatch_async(dispatch_get_main_queue(),^{
[self handleClickAsync];
});
和
[self performSelector:@selector(handleClickAsync) withObject:nil afterDelay:0];
响应按钮按下。
第二个允许 UIButton
像预期的那样突出显示并在下一个运行循环中执行 handleClickAsync
(我想:肯定是“稍后”)。第一个不允许 UIButton
实例点亮,直到操作完全完成。
使用 GCD 执行此操作的正确方法是什么,或者 performSelector
仍然是唯一的方法吗?
最佳答案
我相信可以在 discussion of the main dispatch queue 中找到答案:
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()
提供的标准事件队列一起用于处理提交给主队列的 block 。
当队列中存在 block 时,运行循环将交替从主事件队列和调度队列中取出任务。另一方面,reference对于 -performSelector:withObject:afterDelay:
的 delay
参数,请注意:
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
) 已被处理。但是,当您使用主调度队列时,它会将 block 添加到辅助队列中,然后假设主队列中没有其他 block ,辅助队列可能会立即得到处理(即,在下一个运行循环中)。在这种情况下,取消突出显示按钮的代码仍然位于主事件队列中,而运行循环处理来自辅助 block 队列的事件。
关于objective-c - 在下一个运行循环 : What's Wrong With GCD? 上执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10440412/