สำหรับกรณีการจัดส่งแบบอะซิงโครนัสที่คุณอธิบายไว้ข้างต้นคุณไม่จำเป็นต้องตรวจสอบว่าคุณอยู่ในเธรดหลักหรือไม่ ตามที่ Bavarious ระบุสิ่งนี้จะถูกจัดคิวเพื่อให้สามารถรันบนเธรดหลักได้
อย่างไรก็ตามหากคุณพยายามทำตามข้างบนโดยใช้ a dispatch_sync()
และการติดต่อกลับของคุณอยู่ในเธรดหลักแอปพลิเคชันของคุณจะหยุดชะงักที่จุดนั้น ผมอธิบายเรื่องนี้ในคำตอบของฉันที่นี่-performSelectorOnMainThread:
เพราะพฤติกรรมนี้ทำให้ผมประหลาดใจเมื่อมีการย้ายโค้ดบางส่วนจาก เมื่อฉันพูดถึงที่นั่นฉันได้สร้างฟังก์ชั่นตัวช่วย:
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
ซึ่งจะเรียกใช้บล็อกแบบซิงโครนัสบนเธรดหลักหากวิธีการที่คุณไม่ได้อยู่ในเธรดหลักในปัจจุบันและเพียงแค่เรียกใช้งานบล็อกแบบอินไลน์ถ้าเป็น คุณสามารถใช้ไวยากรณ์ดังต่อไปนี้เพื่อใช้สิ่งนี้:
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});