Objective-C中GCD调度到主线程的问题

时间:2013-09-25 15:31:26

标签: objective-c multithreading

我有这段代码:

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(@“得到主线程。”); });不执行?

2 个答案:

答案 0 :(得分:3)

您的主要队列/主要线程被阻止。

NSLog() dispatch_sync(dispatch_get_main_queue())...之后加myFunction。我敢打赌它不会被打印,因为该块永远不会被执行(如你所示)。

如果是,请在dispatch_sync上设置断点,然后查看主队列/线程的堆栈跟踪。这应该会告诉你它被阻止的原因。

答案 1 :(得分:-3)

您正在创建两个名称相同的队列。这些队列的变量位于不同的上下文中并不重要,队列是应用程序中的全局构造。以不同的方式命名每个队列using the reverse-DNS style