메인 큐로 블록 디스패치는 일반적으로 백그라운드 큐에서 수행되어 일부 백그라운드 처리가 완료되었음을 알립니다.
- (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 업데이트
- 백그라운드 큐에서 처리 된 데이터 청크-> 다음 청크를 시작하도록 기본 큐 신호
- 백그라운드 큐의 수신 네트워크 데이터-> 메시지가 도착했다는 메인 큐에 신호를 보냅니다.
- 등
왜 당신은 메인 큐 에서 메인 큐로 디스패치하고 싶을 까요 ... 글쎄, 일반적으로 다음 번 실행 루프를 위해 몇 가지 작업을 예약하기 위해 할 수는 없습니다.