ใช่. การใช้คิวอนุกรมช่วยให้มั่นใจได้ว่าการดำเนินการตามลำดับ ข้อแตกต่างเพียงอย่างเดียวคือdispatch_sync
ส่งคืนหลังจากบล็อกเสร็จสิ้นเท่านั้นในขณะที่dispatch_async
ส่งคืนหลังจากเพิ่มลงในคิวแล้วและอาจไม่เสร็จสิ้น
สำหรับรหัสนี้
dispatch_async(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_async(_serialQueue, ^{ printf("3"); });
printf("4");
มันอาจจะพิมพ์2413
หรือ2143
หรือ1234
แต่1
ก่อนเสมอ3
สำหรับรหัสนี้
dispatch_sync(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_sync(_serialQueue, ^{ printf("3"); });
printf("4");
มันมักจะพิมพ์ 1234
หมายเหตุ: สำหรับรหัสแรกก็จะไม่1324
พิมพ์ เนื่องจากprintf("3")
ถูกส่งไปหลังจาก printf("2")
ดำเนินการแล้ว และงานสามารถดำเนินการได้หลังจากที่ส่งไปแล้วเท่านั้น
เวลาดำเนินการของงานไม่เปลี่ยนแปลงอะไร รหัสนี้จะพิมพ์เสมอ12
dispatch_async(_serialQueue, ^{ sleep(1000);printf("1"); });
dispatch_async(_serialQueue, ^{ printf("2"); });
สิ่งที่อาจเกิดขึ้นคือ
- เธรด 1: dispatch_async งานที่เสียเวลา (ภารกิจ 1) ไปยังคิวอนุกรม
- เธรด 2: เริ่มดำเนินการภารกิจ 1
- เธรด 1: dispatch_async งานอื่น (ภารกิจ 2) ไปยังคิวอนุกรม
- เธรด 2: ภารกิจ 1 เสร็จสิ้น เริ่มดำเนินการภารกิจ 2
- เธรด 2: ภารกิจ 2 เสร็จสิ้น
และคุณจะเห็นเสมอ 12