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