我有这段代码:
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 样式以不同的方式命名每个队列。