เพื่อให้สอดคล้องกับคำตอบของคำถามที่เกี่ยวข้องฉันจะไม่เห็นด้วยกับ BJ และแนะนำให้คุณดู GCD เป็นครั้งแรกเกี่ยวกับ NSOperation / NSOperationQueue ยกเว้นกรณีหลังนั้นจะมีบางสิ่งที่คุณต้องการที่ GCD ไม่ต้องการ
ก่อน GCD ฉันใช้ NSOperations / NSOperationQueues จำนวนมากในแอปพลิเคชันของฉันเพื่อจัดการภาวะพร้อมกัน อย่างไรก็ตามตั้งแต่ฉันเริ่มใช้ GCD เป็นประจำฉันได้เปลี่ยน NSOperations และ NSOperationQueues เกือบทั้งหมดด้วยบล็อกและส่งคิว สิ่งนี้มาจากวิธีที่ฉันใช้ทั้งสองเทคโนโลยีในทางปฏิบัติและจากการทำโปรไฟล์ที่ฉันได้ทำกับพวกเขา
อย่างแรกคือมีจำนวนค่าใช้จ่ายที่ไม่สำคัญเมื่อใช้ NSOperations และ NSOperationQueues นี่คือวัตถุโกโก้และจำเป็นต้องจัดสรรและยกเลิกการจัดสรร ในแอปพลิเคชัน iOS ที่ฉันเขียนซึ่งแสดงฉาก 3 มิติที่ 60 FPS ฉันใช้ NSOperations เพื่อแค็ปซูลเฟรมที่แสดงผลแต่ละเฟรม เมื่อฉันทำสิ่งนี้การสร้างและการลดลงของ NSOperations เหล่านี้เป็นส่วนสำคัญของรอบการทำงานของ CPU ในแอปพลิเคชันที่ทำงานอยู่และทำให้สิ่งต่าง ๆ ช้าลง ฉันแทนที่สิ่งเหล่านี้ด้วยบล็อกอย่างง่ายและคิวอนุกรม GCD และค่าใช้จ่ายดังกล่าวหายไป นี่ไม่ใช่สถานที่เดียวที่ฉันสังเกตเห็นค่าใช้จ่ายจากการใช้ NSOperations และฉันเห็นสิ่งนี้ทั้งใน Mac และ iOS
ประการที่สองมีความสง่างามในการส่งรหัสตามบล็อกที่ยากที่จะจับคู่เมื่อใช้ NSOperations มันสะดวกอย่างไม่น่าเชื่อที่จะห่อโค้ดสองสามบรรทัดในบล็อกและส่งไปให้ดำเนินการในคิวแบบอนุกรมหรือแบบพร้อมกันซึ่งการสร้าง NSOperation หรือ NSInvocationOperation แบบกำหนดเองเพื่อทำสิ่งนี้ต้องการรหัสสนับสนุนที่มากขึ้น ฉันรู้ว่าคุณสามารถใช้ NSBlockOperation ได้ แต่คุณอาจส่งบางสิ่งไปยัง GCD การห่อโค้ดนี้ในบล็อกแบบอินไลน์ด้วยการประมวลผลที่เกี่ยวข้องในแอปพลิเคชันของคุณทำให้ฉันคิดว่าการจัดระเบียบโค้ดดีกว่าการมีวิธีแยกต่างหากหรือ NSOperations แบบกำหนดเองที่ห่อหุ้มงานเหล่านี้
NSOperations และ NSOperationQueues ยังคงมีการใช้งานที่ดีมาก GCD ไม่มีแนวคิดการพึ่งพาที่แท้จริงที่ NSOperationQueues สามารถตั้งค่ากราฟการพึ่งพาที่ซับซ้อนได้ ฉันใช้ NSOperationQueues สำหรับเรื่องนี้ในบางกรณี
โดยรวมแล้วในขณะที่ฉันมักจะสนับสนุนให้ใช้สิ่งที่เป็นนามธรรมในระดับสูงสุดซึ่งทำงานได้สำเร็จนี่เป็นกรณีหนึ่งที่ฉันโต้แย้ง API ระดับล่างของ GCD ในบรรดานักพัฒนา iOS และ Mac ที่ฉันได้พูดคุยเกี่ยวกับเรื่องนี้ส่วนใหญ่เลือกที่จะใช้ GCD ผ่าน NSOperations เว้นแต่ว่าพวกเขาจะกำหนดเป้าหมายเวอร์ชันของระบบปฏิบัติการโดยไม่รองรับ (เช่นก่อน iOS 4.0 และ Snow Leopard)