Đối với trường hợp điều phối không đồng bộ mà bạn mô tả ở trên, bạn không cần phải kiểm tra xem bạn có ở trên luồng chính hay không. Như Bavarious chỉ ra, điều này chỉ đơn giản sẽ được xếp hàng để được chạy trên luồng chính.
Tuy nhiên, nếu bạn cố gắng thực hiện các thao tác trên bằng cách sử dụng a dispatch_sync()
và cuộc gọi lại của bạn nằm trên luồng chính, ứng dụng của bạn sẽ bế tắc tại thời điểm đó. Tôi mô tả điều này trong câu trả lời của tôi ở đây , bởi vì hành vi này làm tôi ngạc nhiên khi chuyển một số mã từ -performSelectorOnMainThread:
. Như tôi đã đề cập ở đó, tôi đã tạo ra một hàm trợ giúp:
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
sẽ chạy một khối đồng bộ trên luồng chính nếu phương thức bạn hiện không có trên luồng chính và chỉ thực hiện khối nội tuyến nếu có. Bạn có thể sử dụng cú pháp như sau để sử dụng:
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});