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



我有这段代码:

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."); });没有被处决?

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

myFunction dispatch_sync(dispatch_get_main_queue())...后放一个NSLog(). 我敢打赌它不会被打印出来,因为该块永远不会被执行(如您所指出的)。

如果为真,请在该dispatch_sync上设置断点,然后查看主队列/线程的堆栈跟踪。 这应该会给你一个线索,说明为什么它被阻止了。

您正在创建两个具有相同名称的队列。这些队列的变量是否位于不同的上下文中并不重要,队列是应用程序中的全局构造。使用反向 DNS 样式以不同的方式命名每个队列。

最新更新