Вам не нужно ничего вызывать, чтобы запустить диспетчер, но вы не можете выйти из основного потока, иначе ваша программа завершится, даже если есть незавершенная работа с очередями. Вы можете предотвратить выход основного потока, используя семафоры:
int main() {
__block int count = 10;
dispatch_semaphore_t done = dispatch_semaphore_create(0);
dispatch_time_t naptime;
// timeout after 5 seconds
naptime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)5E9);
// no timeout
//naptime = dispatch_time(DISPATCH_TIME_FOREVER, 0);
// schedule some work
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),
^{
dispatch_apply(count, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0),
^(size_t i){
//...
// note: potential race condition on count.
// Synchronization left as an exercise.
if (--count == 0) {
dispatch_semaphore_signal(done);
}
}
);
}
);
if (dispatch_semaphore_wait(done, naptime)) {
// processing didn't complete in allotted time
//...
}
dispatch_release(done);
return 0;
}
Вместо семафоров есть концептуально более простой, но менее полезный подход вызова sleep, или подсчета до огромного числа в цикле (убедитесь, что компилятор не оптимизирует его), или цикла до переменной (изначально установленной в false, установите значение true после завершения обработки) имеет значение true (известное как ожидание занятости). Каждый из них имеет серьезные недостатки и гораздо менее предпочтителен, чем семафор.
Вы также можете проверить это, создав последовательную очередь и несколько раз вызвав для нее dispatch_async, затем dispatch_sync, а затем выйдя из программы.
Есть веские причины для вызова dispatch_main или запуска цикла выполнения, но имейте в виду, что то, что вы отправляете в любую очередь, кроме основной очереди, может начаться ДО запуска цикла выполнения для dispatch_main.
person
Stripes
schedule
03.12.2011