Dispatching a block to the main queue is usually done from a background queue to signal that some background processing has finished e.g.
- (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];
});
});
}
In this case, we are doing a lengthy calculation on a background queue and need to update our UI when the calculation is complete. Updating UI normally has to be done from the main queue so we ‘signal’ back to the main queue using a second nested dispatch_async.
There are probably other examples where you might want to dispatch back to the main queue but it is generally done in this way i.e. nested from within a block dispatched to a background queue.
- background processing finished -> update UI
- chunk of data processed on background queue -> signal main queue to start next chunk
- incoming network data on background queue -> signal main queue that message has arrived
- etc etc
As to why you might want to dispatch to the main queue from the main queue… Well, you generally wouldn’t although conceivably you might do it to schedule some work to do the next time around the run loop.