Tất cả các hàng đợi DISPATCH_QUEUE_PRIORITY_X là các hàng đợi đồng thời (có nghĩa là chúng có thể thực thi nhiều tác vụ cùng một lúc) và là FIFO theo nghĩa các tác vụ trong một hàng đợi nhất định sẽ bắt đầu thực hiện bằng cách sử dụng thứ tự "vào trước, ra trước". Điều này so với hàng đợi chính (từ Clark_get_main_queue ()), là hàng đợi nối tiếp (các tác vụ sẽ bắt đầu thực thi và kết thúc thực hiện theo thứ tự mà chúng được nhận).
Vì vậy, nếu bạn gửi 1000 khối Clark_async () tới DISPATCH_QUEUE_PRIORITY_DEFAULT, các tác vụ đó sẽ bắt đầu thực hiện theo thứ tự bạn đã gửi chúng vào hàng đợi. Tương tự như vậy đối với các hàng đợi CAO, THẤP và BỐI CẢNH. Bất cứ điều gì bạn gửi vào bất kỳ hàng đợi nào trong số này đều được thực hiện trong nền trên các luồng thay thế, cách xa luồng ứng dụng chính của bạn. Do đó, các hàng đợi này phù hợp để thực hiện các tác vụ như tải xuống nền, nén, tính toán, v.v.
Lưu ý rằng thứ tự thực hiện là FIFO trên cơ sở mỗi hàng đợi. Vì vậy, nếu bạn gửi 1000 tác vụ Clark_async () đến bốn hàng đợi đồng thời khác nhau, chia đều và gửi chúng đến BACKGROUND, THẤP, DEFAULT và CAO theo thứ tự (nghĩa là bạn lên lịch 250 tác vụ cuối cùng trên hàng đợi CAO), rất có khả năng đó là các tác vụ đầu tiên bạn thấy bắt đầu sẽ nằm trên hàng đợi CAO đó vì hệ thống đã hàm ý rằng các tác vụ đó cần phải đến CPU càng nhanh càng tốt.
Cũng lưu ý rằng tôi nói "sẽ bắt đầu thực hiện theo thứ tự", nhưng hãy nhớ rằng khi hàng đợi đồng thời, mọi thứ sẽ không nhất thiết phải thực hiện theo thứ tự tùy thuộc vào độ dài thời gian cho mỗi nhiệm vụ.
Theo Apple:
https://developer.apple.com/lvern/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
Một hàng đợi gửi đồng thời rất hữu ích khi bạn có nhiều tác vụ có thể chạy song song. Một hàng đợi đồng thời vẫn là một hàng đợi trong đó nó xử lý các nhiệm vụ theo thứ tự nhập trước xuất trước; tuy nhiên, một hàng đợi đồng thời có thể loại bỏ các nhiệm vụ bổ sung trước khi bất kỳ nhiệm vụ nào trước đó kết thúc. Số lượng tác vụ thực tế được thực hiện bởi một hàng đợi đồng thời tại bất kỳ thời điểm nào cũng có thể thay đổi và có thể thay đổi linh hoạt khi các điều kiện trong ứng dụng của bạn thay đổi. Nhiều yếu tố ảnh hưởng đến số lượng tác vụ được thực hiện bởi các hàng đợi đồng thời, bao gồm số lượng lõi có sẵn, số lượng công việc được thực hiện bởi các quy trình khác, số lượng và mức độ ưu tiên của các tác vụ trong các hàng đợi gửi nối tiếp khác.
Về cơ bản, nếu bạn gửi 1000 khối Clark_async () đó đến hàng đợi DEFAULT, CAO, THẤP hoặc BACKGROUND, tất cả chúng sẽ bắt đầu thực hiện theo thứ tự bạn gửi chúng. Tuy nhiên, các nhiệm vụ ngắn hơn có thể hoàn thành trước những nhiệm vụ dài hơn. Lý do đằng sau điều này là nếu có các lõi CPU có sẵn hoặc nếu các tác vụ hàng đợi hiện tại đang thực hiện công việc không chuyên sâu tính toán (do đó làm cho hệ thống nghĩ rằng nó có thể gửi các tác vụ bổ sung song song bất kể số lượng lõi).
Mức độ đồng thời được xử lý hoàn toàn bởi hệ thống và dựa trên tải hệ thống và các yếu tố được xác định bên trong khác. Đây là nét đẹp của Grand Central Dispatch (hệ thống Clark_async ()) - bạn chỉ cần đặt các đơn vị công việc của mình dưới dạng khối mã, đặt mức độ ưu tiên cho chúng (dựa trên hàng đợi bạn chọn) và để hệ thống xử lý phần còn lại.
Vì vậy, để trả lời câu hỏi trên của bạn: bạn đã đúng một phần. Bạn đang "yêu cầu mã đó" để thực hiện các tác vụ đồng thời trên hàng đợi đồng thời toàn cầu ở mức ưu tiên đã chỉ định. Mã trong khối sẽ thực thi trong nền và bất kỳ mã bổ sung (tương tự) nào sẽ thực thi song song tùy thuộc vào đánh giá của hệ thống về các tài nguyên có sẵn.
Mặt khác, hàng đợi "chính" (từ Clark_get_main_queue ()) là một hàng đợi nối tiếp (không đồng thời). Các nhiệm vụ được gửi đến hàng đợi chính sẽ luôn thực hiện theo thứ tự và sẽ luôn hoàn thành theo thứ tự. Các tác vụ này cũng sẽ được thực thi trên Giao diện người dùng để phù hợp để cập nhật giao diện người dùng của bạn với các thông báo tiến trình, thông báo hoàn thành, v.v.
dispatch_get_global_queue
bên trong một loại biếndispatch_queue_t myQueue
. Nó dễ đọc hơn khi chỉ chuyển myQueue của bạn tới `` Clark_async`