0

我有这段代码:

dispatch_queue_t queue = dispatch_queue_create("Queue", NULL);
dispatch_async(queue, ^{
    //accessing the internet
    dispatch_sync(dispatch_get_main_queue(), ^{
        [myObject myFunction];
    });
});

在 myFunction 中:

dispatch_queue_t queue = dispatch_queue_create("anotherQueue", NULL);
dispatch_async(queue, ^{
    //long task that takes seconds
    dispatch_sync(dispatch_get_main_queue(), ^{
        //this is never executed
        NSLog(@"Got to main thread.");
        //updating the UI
    });
});

有人可以解释为什么块 ^{ NSLog(@"Got to main thread."); }); 不被执行?

4

2 回答 2

3

您的主队列/主线程被阻塞。

在inNSLog()之后放一个。我敢打赌它不会被打印,因为该块永远不会被执行(正如你所指出的那样)。dispatch_sync(dispatch_get_main_queue())...myFunction

如果这是真的,在那个上设置一个断点dispatch_sync,然后查看主队列/线程的堆栈跟踪。这应该为您提供有关它被阻止的原因的线索。

于 2013-09-25T15:43:29.967 回答
-3

您正在创建两个具有相同名称的队列。这些队列的变量在不同的上下文中并不重要,队列是应用程序中的全局构造。使用 reverse-DNS 样式对每个队列进行不同的命名。

于 2013-09-25T15:35:25.143 回答