यह काम करता है, लेकिन एक विरोधी पैटर्न है। अगर मैं विधि को बुलाया जाता है तो मुख्य धागा नहीं है तो मैं क्या करूँगा एक त्रुटि फेंक दें। यह सुनिश्चित करने के लिए कॉलर की ज़िम्मेदारी है कि सही धागे पर विधियों को बुलाया जाए, इस तरह के हैक्स केवल बदसूरत कोड को प्रोत्साहित करते हैं। इसके अलावा, यदि आप इस पर भरोसा करते हैं, तो अचानक जब आप इस विधि को कॉल करते हैं तो अचानक आप संदेश प्रेषण ओवरहेड को दोगुना कर रहे हैं।
तुम सच में नहीं कर सकते फोन करने वाले का व्यवहार को बदलने के हैं, तो आप कोशिश कर सकते हैं निम्नलिखित:
-(void)methodToBeRunOnMainThreadWithObj:(id)object {
dispatch_sync(dispatch_get_main_queue(), ^{
// code goes here
});
}
इस कारण होगा प्रेषण ब्लॉक के अंदर सभी कोड मुख्य थ्रेड पर निष्पादित किया जाना है, और विधि तक लौटाई नहीं जाएगी यह पूर्ण है। यदि आप तुरंत वापस लौटने की विधि चाहते हैं, तो आप इसके बजाय dispatch_async
का उपयोग कर सकते हैं। यदि आप dispatch_sync
का उपयोग करते हैं, तो आप इस चाल का उपयोग उन विधियों पर भी कर सकते हैं जिनमें गैर-शून्य रिटर्न प्रकार हैं।
इस कोड में गैर-ऑब्जेक्ट प्रकारों (int
आदि) के तर्कों के साथ सहायक विधियों का अतिरिक्त लाभ भी है। यह तर्कसंगत संख्याओं के साथ विधियों का भी समर्थन करता है, जबकि performSelector:withObject:
और इसके भाई विधियां केवल सीमित संख्या में तर्कों का समर्थन करती हैं। विकल्प NSInvocation
ऑब्जेक्ट्स सेट अप करना है और ये दर्द हैं।
ध्यान दें कि इसके लिए आपके प्लेटफ़ॉर्म पर ग्रांड सेंट्रल डिस्पैच (जीसीडी) की आवश्यकता है।
क्या एक सुंदर चाल है! प्रतिबंधों को नोट करने के लिए टाइपएफ़ वैकल्पिक – Gerstmann