आपके द्वारा ऊपर वर्णित अतुल्यकालिक प्रेषण मामले के लिए, आपको यह जांचने की आवश्यकता नहीं है कि क्या आप मुख्य धागे पर हैं। जैसा कि बावरियस इंगित करता है, यह केवल मुख्य धागे पर चलने के लिए कतारबद्ध होगा।
हालाँकि, यदि आप उपरोक्त का उपयोग करने का प्रयास करते हैं dispatch_sync()
और आपका कॉलबैक मुख्य धागे पर है, तो आपका आवेदन उसी बिंदु पर गतिरोध करेगा। मैं यहां अपने उत्तर में इसका वर्णन करता हूं , क्योंकि इस व्यवहार ने मुझे आश्चर्यचकित किया जब कुछ कोड को आगे बढ़ाया -performSelectorOnMainThread:
। जैसा कि मैंने वहाँ उल्लेख किया है, मैंने एक सहायक समारोह बनाया:
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
अगर मुख्य विधि पर वर्तमान में आप ब्लॉक नहीं कर रहे हैं, तो मुख्य रूप से एक ब्लॉक चलाएगा, और यदि यह है तो बस ब्लॉक इनलाइन निष्पादित करता है। आप इसका उपयोग करने के लिए सिंटैक्स को नियोजित कर सकते हैं:
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});