1

我在使用 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 阻止运行循环? 我认为这可能与这个问题有关。你们有什么感想?

4

2 回答 2

1

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

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

我不知道你为什么打电话给runUntilDate:,但这可能不是一个很好的理由。

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

于 2012-01-07T22:16:37.687 回答
0

想通了我认为的问题。我正在使用的一些库很可能会发送 NSURLConnections 而不安排在常见的运行循环模式下运行。当组合框打开时,运行循环模式更改为事件跟踪模式,然后无法为它们获取回调。

于 2012-01-08T00:52:40.747 回答