Phù hợp với câu trả lời của tôi cho một câu hỏi liên quan , tôi sẽ không đồng ý với BJ và đề nghị bạn nên xem GCD trước NSOperation / NSOperationQueue, trừ khi sau này cung cấp thứ bạn cần mà GCD không có.
Trước GCD, tôi đã sử dụng rất nhiều NSOperations / NSOperationQueues trong các ứng dụng của mình để quản lý đồng thời. Tuy nhiên, vì tôi bắt đầu sử dụng GCD một cách thường xuyên, tôi gần như đã thay thế hoàn toàn NSOperations và NSOperationQueues bằng các khối và gửi hàng đợi. Điều này xuất phát từ cách tôi sử dụng cả hai công nghệ trong thực tế và từ hồ sơ tôi đã thực hiện trên chúng.
Đầu tiên, có một lượng chi phí không cần thiết khi sử dụng NSOperations và NSOperationQueues. Đây là những đối tượng Ca cao, và chúng cần được phân bổ và giải quyết. Trong một ứng dụng iOS mà tôi đã viết để hiển thị cảnh 3 chiều ở 60 FPS, tôi đã sử dụng NSOperations để gói gọn từng khung hình được hiển thị. Khi tôi mô tả điều này, việc tạo và phá vỡ các NSOperations này đã chiếm một phần đáng kể trong các chu kỳ CPU trong ứng dụng đang chạy và làm mọi thứ chậm lại. Tôi đã thay thế chúng bằng các khối đơn giản và hàng đợi nối tiếp GCD và chi phí đó biến mất, dẫn đến hiệu suất hiển thị tốt hơn đáng kể. Đây không phải là nơi duy nhất tôi nhận thấy chi phí sử dụng NSOperations và tôi đã thấy điều này trên cả Mac và iOS.
Thứ hai, có một sự tao nhã đối với mã công văn dựa trên khối khó khớp khi sử dụng NSOperations. Thật tiện lợi vô cùng khi bọc một vài dòng mã trong một khối và gửi nó đi được thực hiện trên hàng đợi nối tiếp hoặc đồng thời, trong đó việc tạo NSOperation hoặc NSInvocationOperation tùy chỉnh để thực hiện điều này đòi hỏi nhiều mã hỗ trợ hơn. Tôi biết rằng bạn có thể sử dụng NSBlockOperation, nhưng sau đó bạn cũng có thể gửi một cái gì đó đến GCD. Việc gói mã này trong các khối nội tuyến với xử lý có liên quan trong ứng dụng của tôi theo ý kiến của tôi để tổ chức mã tốt hơn so với việc có các phương thức riêng biệt hoặc NSOperations tùy chỉnh đóng gói các tác vụ này.
NSOperations và NSOperationQueues vẫn có những ứng dụng rất tốt. GCD không có khái niệm thực sự về các phụ thuộc, trong đó NSOperationQueues có thể thiết lập các biểu đồ phụ thuộc khá phức tạp. Tôi sử dụng NSOperationQueues cho điều này trong một số ít trường hợp.
Nhìn chung, trong khi tôi thường ủng hộ việc sử dụng mức độ trừu tượng cao nhất để hoàn thành nhiệm vụ, thì đây là một trường hợp tôi tranh luận về API GCD cấp thấp hơn. Trong số các nhà phát triển iOS và Mac mà tôi đã nói về vấn đề này, đại đa số chọn sử dụng GCD thay vì NSOperations trừ khi họ nhắm mục tiêu các phiên bản HĐH mà không hỗ trợ cho nó (những phiên bản trước iOS 4.0 và Snow Leopard).