通常将块分配到主队列是从后台队列完成的,以表示某些后台处理已完成,例如
- (void)doCalculation
{
//you can use any string instead "com.mycompany.myqueue"
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_async(backgroundQueue, ^{
int result = <some really long calculation that takes seconds to complete>;
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUIWithResult:result];
});
});
}
在这种情况下,我们将在后台队列上进行冗长的计算,并且需要在计算完成后更新UI。通常必须从主队列中完成UI的更新,因此我们使用第二个嵌套的dispatch_async将其“信号”回到主队列。
可能还有其他一些示例,您可能希望将其分派回主队列,但通常是通过这种方式完成的,即嵌套在分派给后台队列的块中。
- 后台处理完成->更新UI
- 在后台队列上处理的数据块->通知主队列以开始下一个块
- 后台队列上的传入网络数据->通知主队列消息已到达
- 等
至于为什么可能要从主队列中分派到主队列中呢……好吧,尽管可以想象,您可能不会这样做以安排一些工作在下次运行循环中进行。