我正在尝试以下两种方法:
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中找到:
换句话说,主调度队列设置了辅助队列(与UIApplicationMain()
提供的标准事件队列一起,用于处理提交给主队列的块。
当队列中存在块时,运行循环将交替从主事件队列和调度队列中出队任务。另一方面,delay
的-performSelector:withObject:afterDelay:
参数的reference指出:
因此,当您使用perform选择器时,该操作将在主事件队列的末尾排队,并且只有在队列中它前面的所有内容(可能包括取消UIButton
的代码)被处理后才会执行。但是,当您使用主调度队列时,它将块添加到辅助队列中,然后假设主队列中没有其他块,则有可能立即对其进行处理(即,在下一个运行循环中)。在这种情况下,在运行循环处理次要块队列中的事件时,用于取消突出显示按钮的代码仍位于主事件队列中。