将块分派到主队列通常是从后台队列完成的,以表明某些后台处理已完成,例如
- (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
- 在后台队列上处理的数据块 -> 向主队列发出信号以开始下一个块
- 后台队列上的传入网络数据-> 通知主队列消息已到达
- 等等等等
至于为什么你可能想从主队列分派到主队列......好吧,你通常不会,尽管可以想象你可能会这样做来安排一些工作在下一次运行循环周围做。