Tôi cần gửi một khối trên hàng đợi chính, đồng bộ. Tôi không biết liệu tôi hiện có đang chạy trên luồng chính hay không. Giải pháp ngây thơ trông giống như sau:Cách gửi đồng thời trên hàng đợi chính mà không có bế tắc?
dispatch_sync(dispatch_get_main_queue(), block);
Nhưng nếu hiện tại tôi đang ở trong một khối chạy trên hàng đợi chính, cuộc gọi này sẽ tạo ra bế tắc. (Các công văn đồng bộ chờ khối hoàn thành, nhưng khối thậm chí không bắt đầu chạy, kể từ khi chúng tôi đang chờ đợi hiện tại để kết thúc.)
Bước tiếp theo rõ ràng là kiểm tra hàng đợi hiện tại:
if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
block();
} else {
dispatch_sync(dispatch_get_main_queue(), block);
}
Công trình này, nhưng rất xấu. Trước khi tôi ít nhất giấu nó đằng sau một số chức năng tùy chỉnh, không có giải pháp nào tốt hơn cho vấn đề này không? Tôi nhấn mạnh rằng tôi không thể đủ khả năng gửi khối không đồng bộ - ứng dụng đang ở trong tình huống mà khối được gửi không đồng bộ sẽ được thực thi “quá muộn”.
Tôi nghĩ rằng đó là thay vì giải pháp tốt. Tất cả những gì bạn có thể làm là biến nó thành macro được xác định trước, vì vậy mã của bạn sẽ trông không quá xấu xí. –
Đây là giải pháp "sách giáo khoa" nhiều hơn hoặc ít hơn. –