NSDefaultRunLoopMode बनाम NSRunLoopCommonModes


114

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

मुझे दो मोडों के बारे में विस्तार से देखने को मिलता है, NSDefaultRunLoopMode और NSRunLoopCommonModes, लेकिन सेब का दस्तावेज़ स्पष्ट रूप से नहीं बताता है, कहने के अलावा

NSDefaultRunLoopMode

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

NSRunLoopCommonModes

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

CFRunLoopAddCommonMode

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

किसी को भी मानव भाषा में दो की व्याख्या कर सकते हैं?

जवाबों:


204

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

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

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

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

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

मैं कुछ नोट्स जोड़कर बंद करना चाहूंगा:

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

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


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

7
viggio24 का जवाब एकदम सही है। में रुचि रखने वालों के लिए, मैं बताऊंगा कि WWDC 2010 के सत्र 208 (iPhone OS के लिए नेटवर्क ऐप, भाग 2) में रन लूप पर एक परिचय है। यदि आप रुचि रखते हैं तो एक बार देख लें। आशा करता हूँ की ये काम करेगा।
लोरेंजो बी

19
बस खुद के लिए एक नोट: NSRunLoopCommonModesमें स्क्रॉल करते हुए टाइमर इवेंट की अनुमति देता है UIScrollViewNSDefaultRunLoopModeस्क्रॉल करते समय टाइमर को रोकें।
eonil

2
मुझे स्क्रॉल दृश्य अपडेट के बारे में टिप्पणी बहुत दिलचस्प लगी, क्योंकि इसमें एक बहुत ही चुनौतीपूर्ण विषय का उल्लेख है। बस इस पर अधिक विवरण जोड़ने के लिए: जब आप एक NSURLConnection के लिए एक मोड सेट करते हैं, तो यह केवल प्रतिनिधि कॉल-बैक के निष्पादन को प्रभावित करता है। मैं समझता हूं कि स्क्रॉलव्यू को यहां अपडेट करने से एक प्रदर्शन समस्या हो सकती है, लेकिन ऐसा क्यों हो रहा है? यदि उत्तर यह है कि चित्र को मेमोरी में लोड किया जाना है, तो आप पृष्ठभूमि पर एक ग्राफिक संदर्भ में लिखकर ऐसा कर सकते हैं, और ऐसा करने के बाद अपने विचार मुख्य थ्रेड लेयर को अपडेट कर सकते हैं। क्या यह आवाज़ उचित है?
नेबिलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.