एक रन लूप एक अमूर्तता है जो (अन्य चीजों के अलावा) सिस्टम इनपुट स्रोतों (सॉकेट्स, पोर्ट्स, फाइल्स, कीबोर्ड, माउस, टाइमर आदि) को संभालने के लिए एक तंत्र प्रदान करता है।
प्रत्येक NSThread के पास अपना स्वयं का रन लूप होता है, जिसे currentRunLoop विधि के माध्यम से एक्सेस किया जा सकता है।
सामान्य तौर पर, आपको रन लूप को सीधे एक्सेस करने की आवश्यकता नहीं है, हालांकि कुछ (नेटवर्किंग) घटक हैं जो आपको यह निर्दिष्ट करने की अनुमति दे सकते हैं कि वे कौन से रन लूप का उपयोग करेंगे I / O प्रसंस्करण के लिए।
किसी दिए गए धागे के लिए एक रन लूप तब तक इंतजार करेगा जब तक कि उसके एक या अधिक इनपुट स्रोतों में कुछ डेटा या ईवेंट न हो, फिर प्रत्येक इनपुट स्रोत को संसाधित करने के लिए उपयुक्त इनपुट हैंडलर (एस) को आग दें जो "तैयार" है।
ऐसा करने के बाद, यह अपने लूप में वापस आ जाएगा, विभिन्न स्रोतों से प्रोसेसिंग इनपुट, और "सो" अगर कोई काम नहीं करना है।
यह एक उच्च स्तरीय विवरण है (बहुत सारे विवरणों से बचने की कोशिश)।
संपादित करें
टिप्पणी को संबोधित करने का प्रयास। मैंने उसे टुकड़ों में तोड़ दिया।
- इसका मतलब है कि मैं केवल थ्रेड के अंदर लूप चलाने के लिए उपयोग / रन कर सकता हूं?
वास्तव में। NSRunLoop थ्रेड सुरक्षित नहीं है, और केवल उस थ्रेड के संदर्भ से एक्सेस किया जाना चाहिए जो लूप चला रहा है।
- क्या कोई सरल उदाहरण है कि लूप को चलाने के लिए घटना कैसे जोड़ें?
यदि आप किसी पोर्ट की निगरानी करना चाहते हैं, तो आप उस पोर्ट को रन लूप में जोड़ देंगे, और फिर रन लूप उस पोर्ट को गतिविधि के लिए देखेगा।
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
आप स्पष्ट रूप से एक टाइमर भी जोड़ सकते हैं
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
- इसका क्या अर्थ है कि यह अपने पाश में लौट आएगा?
रन लूप सभी तैयार घटनाओं को प्रत्येक पुनरावृत्ति (इसके मोड के अनुसार) संसाधित करेगा। रन मोड के बारे में खोजने के लिए आपको दस्तावेज़ देखने की आवश्यकता होगी, क्योंकि यह सामान्य उत्तर के दायरे से थोड़ा परे है।
- जब मैं धागा शुरू करता हूं तो रन लूप निष्क्रिय होता है?
अधिकांश अनुप्रयोगों में, मुख्य रन लूप स्वचालित रूप से चलेगा। हालांकि, आप रन लूप शुरू करने और आपके द्वारा स्पिन किए जाने वाले थ्रेड्स के लिए आने वाली घटनाओं का जवाब देने के लिए जिम्मेदार हैं।
- क्या थ्रेड के बाहर थ्रेड रन लूप में कुछ ईवेंट जोड़ना संभव है?
मुझे यकीन नहीं है कि तुम यहाँ क्या मतलब है। आप रन लूप में ईवेंट न जोड़ें। आप इनपुट स्रोतों और टाइमर स्रोतों (रन लूप के मालिक के धागे से) को जोड़ते हैं। रन लूप फिर उन्हें गतिविधि के लिए देखता है। आप निश्चित रूप से, अन्य थ्रेड्स और प्रक्रियाओं से डेटा इनपुट प्रदान कर सकते हैं, लेकिन इनपुट रन लूप द्वारा संसाधित किया जाएगा जो थ्रेड पर उन स्रोतों की निगरानी कर रहा है जो रन लूप चला रहे हैं।
- क्या इसका मतलब यह है कि कभी-कभी मैं थ्रेड को ब्लॉक करने के लिए रन लूप का उपयोग कर सकता हूं
वास्तव में। वास्तव में, एक रन लूप एक इवेंट हैंडलर में "ठहर" जाएगा, जब तक कि ईवेंट हैंडलर वापस नहीं आ जाता। आप इसे बस किसी भी ऐप में देख सकते हैं। किसी भी IO कार्रवाई (जैसे, बटन प्रेस) के लिए एक हैंडलर स्थापित करें जो सोता है। आप मुख्य रन लूप (और पूरे UI) को ब्लॉक कर देंगे, जब तक कि वह विधि पूरी नहीं हो जाती।
वही किसी भी रन लूप पर लागू होता है।
मेरा सुझाव है कि आप रन लूप पर निम्नलिखित दस्तावेज पढ़ें:
https://developer.apple.com/documentation/foundation/nsrunloop
और धागे के भीतर उनका उपयोग कैसे किया जाता है:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1