2011-08-28 6 views
86

stackoverflow के प्रिय अच्छे लोग,NSDefaultRunLoopMode बनाम NSRunLoopCommonModes

बस पिछली बार की तरह, मैं इसके द्वारा एक सवाल मैं हाल ही में पर आते हैं लाने के लिए। मुझे उम्मीद है कि वहां कोई व्यक्ति मुझ पर कुछ प्रकाश डाल सकता है।

जब भी मैं UIScrollView, MPMapView या कुछ के पीछे एक बड़ी फ़ाइल डाउनलोड करने का प्रयास करता हूं, जैसे ही मैं आईफोन स्क्रीन को स्पर्श करता हूं, डाउनलोडिंग प्रक्रिया रोक दी जाती है। शुक्र है, Jörn द्वारा एक भयानक ब्लॉग पोस्ट कनेक्शन के लिए NSRunLoopCommonModes का उपयोग करके एक वैकल्पिक विकल्प सुझाता है।

जो मुझे दो मोड, NSDefaultRunLoopMode और NSRunLoopCommonModes के विस्तार में लग रही हो जाता है, लेकिन सेब दस्तावेज़ कृपया

NSDefaultRunLoopMode

मोड कह इनपुट सूत्रों अन्य से निपटने के लिए की तुलना में व्याख्या नहीं करता है, अन्य NSConnection वस्तुओं की तुलना में। यह सबसे अधिक इस्तेमाल किया जाने वाला रन-लूप मोड है।

NSRunLoopCommonModes

वस्तुओं मोड के रूप में इस मूल्य का उपयोग कर सभी रन पाश मोड कि "आम" मोड के सेट के एक सदस्य के रूप में घोषित किया गया है द्वारा निगरानी की जाती एक रन पाश को जोड़ा गया, देखना जानकारी के लिए CFRunLoopAddCommonMode का विवरण।

CFRunLoopAddCommonMode

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

क्या कोई भी मानव भाषा में दोनों को समझा सकता है?

उत्तर

164

एक रन लूप एक तंत्र है जो सिस्टम को सोने के धागे को जागने की अनुमति देता है ताकि वे एसिंक्रोनस घटनाओं का प्रबंधन कर सकें। आम तौर पर जब आप थ्रेड चलाते हैं (मुख्य धागे के अपवाद के साथ) थ्रेड को रन लूप में शुरू करने का विकल्प होता है या नहीं। यदि थ्रेड बाहरी घटनाओं और टाइमर के बिना बातचीत के बिना कुछ प्रकार या लंबे समय तक चलने वाले ऑपरेशन चलाता है, तो आपको रन लूप की आवश्यकता नहीं है, लेकिन यदि आपके थ्रेड को आने वाली घटनाओं का जवाब देने की आवश्यकता है, तो इसे एक रन लूप से जोड़ा जाना चाहिए जब नई घटनाएं आती हैं तो धागे को जगाएं। यह NSURLConnection जेनरेटेड थ्रेड का मामला है, क्योंकि वे केवल आने वाली घटनाओं (नेटवर्क से) पर जागते हैं।

प्रत्येक थ्रेड एकाधिक रन लूप से जुड़ा जा सकता है, या एक विशिष्ट रन लूप से जोड़ा जा सकता है जिसे विभिन्न तरीकों से काम करने के लिए सेट किया जा सकता है। ए "रन लूप मोड" ओएस द्वारा उपयोग किए जाने वाले एक सम्मेलन को कुछ घटनाओं को वितरित करने के लिए या बाद में वितरित करने के लिए एकत्रित करने के लिए कुछ नियम स्थापित करने के लिए किया जाता है।

आमतौर पर सभी रन लूप "डिफ़ॉल्ट मोड" पर सेट होते हैं जो इनपुट ईवेंट प्रबंधित करने का एक डिफ़ॉल्ट तरीका स्थापित करता है।उदाहरण के लिए: जैसे ही माउस-ड्रैगिंग (मैक ओएस) या स्पर्श (आईओएस पर) ईवेंट होता है, तो इस रन लूप के लिए मोड इवेंट ट्रैकिंग पर सेट होता है; इसका मतलब है कि थ्रेड को नए नेटवर्क इवेंट्स पर नहीं जगाया जाएगा, लेकिन इन घटनाओं को बाद में वितरित किया जाएगा जब उपयोगकर्ता इनपुट इवेंट समाप्त हो जाता है और रन लूप फिर से डिफ़ॉल्ट मोड पर सेट हो जाता है; जाहिर है यह ओएस आर्किटेक्ट्स द्वारा पृष्ठभूमि घटनाओं की बजाय उपयोगकर्ता घटनाओं को प्राथमिकता देने के लिए एक विकल्प है।

आप अपने NSURLConnection थ्रेड के लिए रन पाश मोड बदलने के लिए, scheduleInRunLoop:forModes: का उपयोग करके निर्णय लेते हैं, तो आप धागा एक विशेष रन पाश को मोड, बजाय विशिष्ट डिफ़ॉल्ट रन पाश असाइन कर सकते हैं। NSRunLoopCommonModes नामक विशेष छद्म-मोड का उपयोग ईवेंट ट्रैकिंग सहित कई इनपुट स्रोतों द्वारा किया जाता है। उदाहरण के लिए, सामान्य मोड में NSURLConnection के उदाहरण को निर्दिष्ट करने का अर्थ है "डिफ़ॉल्ट मोड" के अतिरिक्त इसकी घटनाओं को "ट्रैकिंग मोड" से जोड़ता है। NSRunLoopCommonModes के साथ धागे को जोड़ने का एक लाभ/नुकसान यह है कि धागा को स्पर्श घटनाओं से अवरुद्ध नहीं किया जाएगा।

नए मोड को सामान्य मोड में जोड़ा जा सकता है, लेकिन यह काफी कम स्तर का ऑपरेशन है।

मैं कुछ नोट्स जोड़कर बंद करने के लिए करना चाहते हैं:

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

  • आप जीसीडी का उपयोग करने पर विचार कर सकते हैं जो रन लूप प्रबंधन समस्याओं से आपके कोड को "ढाल" करने में आपकी सहायता करेगा। उपर्युक्त उदाहरण में, आप कस्टम सीरियल कतार में अपने नेटवर्क अनुरोध जोड़ने पर विचार कर सकते हैं।

+6

प्रिय विगियो 24, इस स्वच्छ, सटीक स्पष्टीकरण के लिए आपको बहुत बहुत धन्यवाद। मैं ऐप्पल से आपकी एपीआई गाइड में अपनी टिप्पणी शामिल करने के लिए कहूंगा। ;) – Stkim1

+0

मैंने आपका जवाब ऊपर उठाया क्योंकि बिल्कुल स्पष्ट है !! अपनी जानकारी साझा करने के लिए धन्यवाद। –

+3

** viggio24 ** का जवाब सही है। रुचि रखने वालों के लिए, मैं इंगित करता हूं कि ** डब्ल्यूडब्ल्यूडीसी 2010 से ** सत्र 208 (आईफोन ओएस, भाग 2 के लिए नेटवर्क ऐप्स) ** रन लूप पर एक परिचय है। यदि आप रुचि रखते हैं तो एक नज़र डालें। आशा करता हूँ की ये काम करेगा। –