我有这段代码:
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(@“得到主线程。”); });不执行?
答案 0 :(得分:3)
您的主要队列/主要线程被阻止。
在NSLog()
dispatch_sync(dispatch_get_main_queue())...
之后加myFunction
。我敢打赌它不会被打印,因为该块永远不会被执行(如你所示)。
如果是,请在dispatch_sync
上设置断点,然后查看主队列/线程的堆栈跟踪。这应该会告诉你它被阻止的原因。
答案 1 :(得分:-3)
您正在创建两个名称相同的队列。这些队列的变量位于不同的上下文中并不重要,队列是应用程序中的全局构造。以不同的方式命名每个队列using the reverse-DNS style。