あなたが呼び出す必要はありませんディスパッチャを起動するには何もしませんが、メインスレッドを終了することはできません。キューに不完全な作業がある場合は、プログラムが終了します。あなたは、セマフォを使用してから出るのメインスレッドを防ぐことができます。
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;
}
代わりのセマフォ、睡眠を呼び出し、またはループ内の膨大な数に数えるの概念的簡単にあまり使用可能なアプローチは、(コンパイラはdoesnのを確認してあります最適化しない)、または変数(最初はfalseに設定され、処理が完了するとtrueに設定される)がtrueになるまでループします(busy-wait)。これらのそれぞれには重大な欠陥があり、セマフォよりもはるかにあまり好ましくありません。
また、シリアルキューを作成し、それに数回ディスパッチ_同期を呼び出してからディスパッチ_同期を実行し、プログラムを終了することでテストすることもできます。
dispatch_mainを呼び出すか、実行ループを開始する理由はありますが、メインキュー以外のすべてのキューに送信するものは、から開始することができます。 runloop to dispatch_mainが開始されます。
あなたはdispatch_mainコールは必要ありません。たとえば、10秒の睡眠に置き換えた場合、5秒のタイマーが引き続きトリガーされます。 – Stripes