Sử dụng NSThread (hoặc thậm chí pthreads API) khi bạn muốn hoặc cần kiểm soát trực tiếp các luồng bạn tạo ra, ví dụ như bạn cần kiểm soát chi tiết ưu tiên của luồng hoặc bạn đang tương tác với một hệ thống con khác mà cung cấp/tiêu thụ các đối tượng luồng trực tiếp và bạn cần duy trì sự tương tác với nó. Các trường hợp như vậy hiếm, nhưng thực sự tồn tại, đặc biệt là trong các ứng dụng thời gian thực.
Sử dụng GCD khi nhiệm vụ của bạn phù hợp với việc song song hóa đơn giản, ví dụ như bạn chỉ muốn "đẩy một số công việc vào background" mà không cần nhiều công việc phụ, bạn có một số cấu trúc dữ liệu mà bạn chỉ muốn tuần tự hóa quyền truy cập vào (và hàng đợi tuần tự rất tốt để làm điều đó một cách không khóa), bạn có một số vòng lặp for mà có thể được song song hóa bằng dispatch_apply(), bạn có một số nguồn dữ liệu / bộ hẹn giờ mà GCD's sources API cho phép bạn dễ dàng xử lý trong background, v.v. GCD rất mạnh mẽ và bạn có thể sử dụng nó cho rất nhiều mục đích khác nhau, nhưng đây đều là những tình huống "đơn giản như đèn đóm" mà bạn không muốn bị vướng vào nhiệm vụ khởi tạo và thiết lập nhiều mà chỉ đơn giản là "làm những việc cơ bản song song".
Sử dụng NSOperation khi bạn đã làm việc ở tầng API Cocoa (so với việc viết bằng ngôn ngữ C trực tiếp đến các giao diện POSIX) và có các hoạt động phức tạp hơn bạn muốn song song hóa. NSOperation cho phép kế thừa, các đồ thị phụ thuộc tùy ý, hủy bỏ và hỗ trợ một số ngữ nghĩa cấp cao khác mà có thể hữu ích cho bạn. NSOperation thực tế sử dụng GCD bên trong nên nó hoàn toàn tương thích với nhiều nhân, nhiều luồngcó thể như GCD, tuy nhiên nó cũng mang theo framework Foundation, vì vậy nếu bạn đang làm việc với POSIX layer, có lẽ bạn nên sử dụng tùy chọn số 2.