objective-c - 在下一个运行循环 : What's Wrong With GCD? 上执行

标签 objective-c ios asynchronous grand-central-dispatch

我正在尝试这两种方法:

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/

相关文章:

objective-c - 使用 NSFetchedResultsController 时是否可以获得不同的结果?

objective-c - 使用 NSEvent 在 OS X 上捕获其他鼠标按钮事件

iphone - 如何加载预放大的 WebView? (在 Xcode/Objective C 中)

ios - 类没有初始化程序

c# - 是.GetAwaiter().GetResult();一般用途安全吗?

ios - 在 Popover tableview 中选择单元格后 UILabel 不刷新

ios - 如何隐藏工具栏中的反馈按钮?

ios - Nativescript Apple 应用商店 仅限 iPhone

javascript - 从客户端调用 node.js 服务时的竞争条件

c# - .NET Disruptor 异步模式