Việc gửi một khối tới hàng đợi chính thường được thực hiện từ hàng đợi nền để báo hiệu rằng một số xử lý nền đã kết thúc, vd
- (void)doCalculation
{
//you can use any string instead "com.mycompany.myqueue"
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_async(backgroundQueue, ^{
int result = <some really long calculation that takes seconds to complete>;
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUIWithResult:result];
});
});
}
Trong trường hợp này, chúng tôi đang thực hiện một phép tính dài trên hàng đợi nền và cần cập nhật giao diện người dùng của chúng tôi khi tính toán hoàn tất. Việc cập nhật giao diện người dùng thông thường phải được thực hiện từ hàng đợi chính để chúng tôi 'báo hiệu' trở lại hàng đợi chính bằng cách sử dụng công cụ thứ hai được lồng vào nhau.
Có thể có các ví dụ khác mà bạn có thể muốn gửi trở lại hàng đợi chính nhưng nó thường được thực hiện theo cách này, nghĩa là được lồng từ bên trong một khối được gửi đến hàng đợi nền.
- xử lý nền xong -> cập nhật giao diện người dùng
- khối dữ liệu được xử lý trên hàng đợi nền -> tín hiệu hàng đợi chính để bắt đầu đoạn tiếp theo
- dữ liệu mạng đến trên hàng đợi nền -> tín hiệu hàng đợi chính mà tin nhắn đã đến
- Vân vân
Về lý do tại sao bạn có thể muốn gửi đến hàng đợi chính từ hàng đợi chính ... Chà, nói chung bạn sẽ không mặc dù bạn có thể làm điều đó để lên lịch một số công việc phải làm trong lần tiếp theo xung quanh vòng chạy.