2012-06-08 6 views
16

हम कई संचालकों हो सकता है (रेस स्थिति रोकथाम के लिए): हैंडलर, UIControl हैंडलर (बटन, स्लाइडर), performSelector, CADisplayLink, NSTimer घटनाओं, इशारा पहचानकर्ता, एक्सीलरोमीटर हैंडलर, और UIView एनीमेशन पूरा होने के ब्लॉक, और कुछ अन्य लोगों को छूता है ।आमतौर पर एक ही थ्रेड में आईओएस ऐप में सभी विधियां हैं?

क्या वे सभी एक ही धागे में हैं? यही है, उनमें से केवल एक ही समय में चल रहा है?

किसी अन्य विधि या हैंडलर एक और धागा का हिस्सा हो सकता है और इसलिए दौड़ की स्थिति पैदा कर सकते हैं कर सकते हैं?

+1

+1 अच्छा सवाल –

उत्तर

16

सामान्य में, आपको लगता है कि सबसे सरल आवेदन पर आईओएस मुख्य थ्रेड पर लगभग हर क्रिया करने के लिए करते हैं मिल जाएगा। जैसा कि आपने नोट किया है, पल में आप मल्टीथ्रेडिंग लाते हैं, इसके लिए आप मुश्किल मुद्दों का एक और सेट जोड़ते हैं। कई डेवलपर इस अतिरिक्त जटिलता से परेशान नहीं होना चाहते हैं, या सामान्य रूप से जीसीडी या थ्रेडिंग से अपरिचित हैं, इसलिए वे पृष्ठभूमि थ्रेड या जीसीडी कतार पर कुछ भी करने से बचते हैं।

आपके प्रश्न में सूचीबद्ध कई आइटम UIKit के साथ इंटरैक्शन शामिल करते हैं, और आम तौर पर उन इंटरैक्शन मुख्य थ्रेड पर होते हैं (आईओएस 4.x ने पृष्ठभूमि में कुछ ड्राइंग फ़ंक्शंस करने की क्षमता को जोड़ा)। आप मुख्य धागे पर स्पर्श और अन्य संबंधित घटनाएं प्राप्त करते हैं। यदि आप किसी इंटरफ़ेस के अधिकांश पहलुओं को अपडेट करना चाहते हैं, तो ऐसा करने का सुरक्षित तरीका मुख्य थ्रेड पर इन अद्यतनों को निष्पादित करना है।

टाइमर (एनएसटीमर, कैडिसप्लेलिंक) उनके पृष्ठभूमि थ्रेड पर ऑपरेटिंग एनएसआरनलूप पर संलग्न करके उनके अपडेट पृष्ठभूमि थ्रेड पर निकाल दिए जा सकते हैं। आप शायद ही कभी लोगों को ऐसा करते देखते हैं, लेकिन यह किया जा सकता है। आम तौर पर, लोग मुख्य रन लूप पर टाइमर कॉन्फ़िगर करते हैं, जो मुख्य थ्रेड पर कॉलबैक वितरित किए जाते हैं।

एनिमेशन करते समय, एनिमेशन स्वयं पृष्ठभूमि थ्रेड पर चलाएंगे (आप देखते हैं कि जब आप मुख्य धागे को किसी अन्य चीज़ से अवरुद्ध कर रहे हैं तो वे रुकते नहीं हैं), लेकिन आप लगभग हमेशा एक पूर्णता ब्लॉक प्राप्त करेंगे या जब वे पूरा हो जाते हैं तो मुख्य धागे पर कॉलबैक। अगर मुझे सही याद है, तो इसमें एक या दो अपवाद हैं और वे ऐप्पल के दस्तावेज में इस तरह के रूप में उल्लेखनीय हैं। इन थ्रेडबैक को मुख्य थ्रेड पर ट्रिगर करना उन डेवलपर्स से निपटने पर एक सुरक्षित दृष्टिकोण है जो शायद महसूस नहीं कर सकते कि दृश्यों के पीछे क्या चल रहा है।

जो कुछ भी कहा गया है, आपके आवेदन में मल्टीथ्रेडिंग जोड़ने के बहुत अच्छे कारण हैं। चूंकि सभी उपयोगकर्ता इंटरफ़ेस अपडेट और टच इंटरैक्शन मुख्य थ्रेड पर होते हैं, यदि आपके पास कुछ ऐसा है जो कम्प्यूटेशनल रूप से महंगा है या जो इसे करने के लिए बहुत समय लगेगा, यदि आप इसे अपने मुख्य थ्रेड पर चलाते हैं तो आप अपने आप को जमे हुए दिखेंगे आवेदन। यह एक भयानक उपयोगकर्ता अनुभव है, इसलिए आप इस कार्य को पृष्ठभूमि थ्रेड पर ले जाना चाहते हैं ताकि उपयोगकर्ता चालू होने पर आपके एप्लिकेशन के साथ बातचीत कर सके। इसके अतिरिक्त, अधिक से अधिक आईओएस डिवाइस हर दिन कई कोर के साथ शिपिंग कर रहे हैं, और इन कोरों में अपने काम के भार को संतुलित करते हुए और इस हार्डवेयर के साथ कुशल होने के लिए कुछ डिग्री समवर्ती प्रोसेसिंग की आवश्यकता होती है।

लोग सर्वोत्तम प्रथाओं में पुस्तकें लिखी हैं जब कोड बहु रही है, और तुम यहाँ इस बारे में सवालों की एक बहुत कुछ मिल सकता है, तो मैं बहुत ज्यादा विस्तार में नहीं जाना होगा। मैं आपको बता सकता हूं कि आपको ऐप्पल के Concurrency Programming Guide को पढ़ना चाहिए और पिछले दो वर्षों से डब्ल्यूडब्ल्यूडीसी वीडियो देखना चाहिए जो ग्रांड सेंट्रल डिस्पैच से निपटता है। जीसीडी के साथ, ऐप्पल ने आपके आवेदन में मल्टीथ्रेडिंग को एक कुशल और (अपेक्षाकृत) सुरक्षित तरीके से जोड़ने के लिए बहुत आसान बना दिया है, और मैं आपको अपने अनुप्रयोगों के लिए इसे देखने के लिए प्रोत्साहित करता हूं।

उदाहरण के लिए, मैं एक खुला स्रोत iOS ऐप्लिकेशन है जो आणविक संरचना की विस्तृत प्रतिपादन करता है।मैं एक पृष्ठभूमि जीसीडी कतार पर प्रत्येक फ्रेम प्रस्तुत करता हूं क्योंकि कभी-कभी वे प्रक्रिया के लिए एक सेकंड के 1/60 वें स्थान लेते हैं, और उन मामलों में वे स्पर्श घटनाओं को गिराएंगे और इंटरफ़ेस को स्टटर करने के लिए अगर यह सब मुख्य धागे पर था । इसके अतिरिक्त, मैंने नए मल्टीकोर उपकरणों पर चलते समय ऐसा करके 40% प्रदर्शन को बढ़ावा दिया है। दौड़ की स्थितियों से बचने के लिए, मैं सीरियल प्रेषण कतारों में साझा डेटा संरचनाओं और संदर्भों के साथ इंटरैक्शन लपेटता हूं ताकि एक ही समय में संसाधन का उपयोग कर एक ही क्रिया हो, चाहे कोई विशेष ब्लॉक क्या थ्रेड चल रहा हो। इसे केवल कोड की कुछ पंक्तियों के अतिरिक्त की आवश्यकता थी, लेकिन प्रदर्शन और उपयोगकर्ता अनुभव लाभ बहुत बड़े थे।

संबंधित मुद्दे