在下一次运行循环中执行:GCD有什么错误?

我正在尝试这两种方法:

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

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

响应button按下。

第二个允许UIButton高亮所期望的,并在下一个运行循环中执行handleClickAsync (我想:“稍后”肯定)。 第一个不允许UIButton实例点亮,直到操作完成。

什么是正确的方法来做到这一点与GCD,或者是performSelector仍然是唯一的方法?

我相信在这里讨论主要调度队列时可以find答案:

该队列与应用程序的运行循环(如果存在的话)一起工作,以便将执行排队的任务与执行附加到运行循环的其他事件源进行交错。

换句话说,主分派队列build立一个辅助队列(与UIApplicationMain()提供的标准事件队列一起处理提交给主队列的块。当队列中存在块时,运行循环将交替出队主事件队列和调度队列。另一方面, -performSelector:withObject:afterDelay:delay参数的-performSelector:withObject:afterDelay:指出:

指定延迟0不一定会导致select器立即执行。 select器仍在线程的运行循环中排队,并尽快执行。

因此,在使用执行select器时,操作在主事件队列的末尾排队,直到在队列前面的所有内容(可能包括代码忽略UIButton )都被处理之后才会执行。 但是,如果使用主调度队列,则会将该块添加到辅助队列中,然后可能会立即进行处理(即在下一个运行循环中),假定主队列中没有其他块。 在这种情况下,忽略button的代码仍然位于主事件队列中,而运行循环则从辅助块队列处理事件。

我认为这会打击你的观点:

 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ //bla bla bla }];