Bạn không cần phải gọi bất cứ điều gì để bắt đầu điều phối, nhưng bạn không thể thoát khỏi chủ đề chính hoặc chương trình của bạn sẽ thoát nếu nếu không có công việc không hoàn thành trên hàng đợi. Bạn có thể ngăn các chủ đề chính từ thoát bằng cách sử dụng Cột:
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;
}
Thay vì Cột, có cách tiếp cận khái niệm dễ dàng hơn nhưng ít sử dụng được gọi giấc ngủ, hoặc đếm đến một con số khổng lồ trong một vòng lặp (chắc chắn rằng trình biên dịch doesn không tối ưu hóa nó đi), hoặc looping cho đến khi một biến (ban đầu được đặt thành false, được đặt thành true khi xử lý xong) là true (được gọi là busy-wait). Mỗi trong số này có những thiếu sót nghiêm trọng và ít thích hợp hơn so với một semaphore.
Bạn cũng có thể kiểm tra bằng cách tạo hàng đợi nối tiếp và gọi dispatch_async trên đó một vài lần, sau đó dispatch_sync, sau đó thoát khỏi chương trình.
Có lý do chính đáng để gọi dispatch_main hoặc bắt đầu chạy vòng lặp, nhưng lưu ý những thứ bạn gửi tới hàng đợi bất kỳ, trừ hàng đợi chính có thể bắt đầu TRƯỚC KHI runloop to dispatch_main được bắt đầu.
Bạn không cần cuộc gọi dispatch_main. Nếu bạn thay thế nó bằng giấc ngủ 10 giây, ví dụ như bộ đếm thời gian 5 giây sẽ vẫn kích hoạt. – Stripes