gpt4 book ai didi

objective-c - Runloop 不处理来自dispatch_async 的事件

转载 作者:行者123 更新时间:2023-12-03 17:15:17 27 4
gpt4 key购买 nike

我在使用dispatch_async 时遇到一些问题。在我的应用程序主/UI 线程上,我在全局队列上调用dispatch_async,并告诉它执行一些具有完成处理程序的函数调用。我期望完成处理程序被调用,但有时似乎不会被调用。

dispatch_queue_t hiq = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(hiq, ^(void){
[object doSomethingAndThenCompletionHandler:^(){
//Do some stuff because I'm done
}];
});

有趣的是,每当我在文本字段中输入内容时,我都会这样做以响应 controlTextDidChange。 当我单击文本字段外时,所有完成处理程序都会立即触发。

我的猜测是,我的所有完成处理程序都在运行循环上的某些内容后面排队,然后当我的 UI 元素失去焦点时,就会释放队列。我不是运行循环方面的专家,无法知道当我在文本字段或组合框中键入内容时到底发生了什么,但也许它会占用运行循环?

编辑:我认为这与运行循环模式有关,因为当我打印出运行循环模式时,它会打印为 NULL,除了在完成处理程序中打印为默认模式时。我使用的是组合框,只有当组合框打开并展开时才会出现此问题。 UIScrollView blocks run loop?我想这可能与这个问题有关。大家觉得怎么样?

最佳答案

当你执行[[NSRunLoop currentRunLoop] runUntilDate: FiveSecondsFromNow]时,它会递归地进入runloop,并且runloop正常处理事件。因此,如果文本字段收到另一个事件,它将再次调用您的方法。堆栈跟踪看起来像这样(有更多与 NSRunLoop 相关的帧):

main
NSApplicationMain
-[NSRunLoop runUntilDate:]
your method
-[NSRunLoop runUntilDate:]
your method

我不知道您为什么调用 runUntilDate:,但这可能没有充分的理由。

如果您需要帮助了解为什么未调用完成处理程序,那么您需要向我们展示您的 doSomethingAndThenCompletionHandler: 方法的定义。

关于objective-c - Runloop 不处理来自dispatch_async 的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8773441/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com