การส่งบล็อคไปยังคิวหลักมักจะทำจากคิวพื้นหลังเพื่อส่งสัญญาณว่าการประมวลผลเบื้องหลังบางส่วนเสร็จสิ้นเช่น
- (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
- กลุ่มข้อมูลที่ประมวลผลบนคิวพื้นหลัง -> ส่งสัญญาณคิวหลักเพื่อเริ่มกลุ่มถัดไป
- ข้อมูลเครือข่ายขาเข้าในคิวพื้นหลัง -> ส่งสัญญาณคิวหลักที่ข้อความมาถึง
- ฯลฯ
สำหรับสาเหตุที่คุณอาจต้องการส่งไปยังคิวหลักจากคิวหลัก ... โดยทั่วไปคุณจะไม่คิดว่าคุณอาจทำมันเพื่อกำหนดเวลางานบางอย่างที่จะทำในครั้งต่อไปรอบลูปรัน