Пересилання блоку в основну чергу, як правило, здійснюється з фонової черги, щоб сигналізувати про те, що деяка обробка фону закінчена, наприклад
- (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];
});
});
}
У цьому випадку ми робимо тривалий розрахунок у фоновій черзі і нам потрібно оновити наш інтерфейс користувача після завершення розрахунку. Оновлення користувальницького інтерфейсу, як правило, повинно здійснюватися з основної черги, тому ми "подаємо сигнал" до головної черги за допомогою другої вкладеної dispatch_async.
Ймовірно, є й інші приклади, коли ви можете відправити назад до основної черги, але це, як правило, робиться таким чином, тобто вкладене всередині блоку, відправленого у фонову чергу.
- обробка фону завершена -> оновлення інтерфейсу користувача
- фрагмент даних, оброблених у фоновій черзі -> сигнал основної черги, щоб почати наступний фрагмент
- вхідні мережеві дані у фоновій черзі -> сигнал головної черги, що повідомлення надійшло
- тощо
Щодо того, чому ви хочете відправити до основної черги з головної черги ... Ну, ви, як правило, не хочете, хоч можливо, ви могли б це зробити, щоб запланувати якусь роботу, щоб виконати наступний раз навколо циклу запуску.