我正在尝试以下两种方法:

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的代码)被处理后才会执行。但是,当您使用主调度队列时,它将块添加到辅助队列中,然后假设主队列中没有其他块,则有可能立即对其进行处理(即,在下一个运行循环中)。在这种情况下,在运行循环处理次要块队列中的事件时,用于取消突出显示按钮的代码仍位于主事件队列中。

07-24 09:29