चिंता क्यों?
जैसे ही आप अपने ऐप में भारी कार्य जोड़ते हैं, जैसे डेटा लोड करना यह आपके यूआई काम को धीमा कर देता है या इसे जमा देता है। Concurrency आपको 2 या अधिक कार्य "एक साथ" करने देता है। इस दृष्टिकोण का नुकसान यह है कि धागा सुरक्षा जो नियंत्रण के लिए हमेशा आसान नहीं होती है। Fe जब अलग-अलग कार्य एक ही संसाधनों को एक्सेस करना चाहते हैं जैसे कि एक अलग वेरिएबल पर एक ही वेरिएबल को बदलने की कोशिश करना या अलग-अलग थ्रेड द्वारा पहले से ब्लॉक किए गए संसाधनों तक पहुंचना।
कुछ सार हैं जिनसे हमें अवगत होने की आवश्यकता है।
- कतार।
- तुल्यकालिक / अतुल्यकालिक कार्य प्रदर्शन।
- प्राथमिकताएं।
- आम परेशानियाँ।
कतार
सीरियल या समवर्ती होना चाहिए । साथ ही साथ वैश्विक या निजी भी ।
धारावाहिक कतारों के साथ, कार्यों को एक-एक करके समाप्त किया जाएगा, जबकि समवर्ती कतारों के साथ, कार्यों को एक साथ किया जाएगा और अप्रत्याशित शेड्यूल पर समाप्त किया जाएगा। समवर्ती कतार की तुलना में कार्यों का एक ही समूह धारावाहिक कतार पर अधिक समय लेगा।
आप अपनी निजी कतारें बना सकते हैं ( धारावाहिक या समवर्ती दोनों ) या पहले से उपलब्ध वैश्विक (सिस्टम) कतारों का उपयोग कर सकते हैं । मुख्य कतार केवल है धारावाहिक कतार के सभी से बाहर वैश्विक कतारों ।
यह उन भारी कार्यों को नहीं करने के लिए अत्यधिक अनुशंसित है, जो यूआई काम को मुख्य कतार (नेटवर्क से फ़्ल लोडिंग डेटा) पर संदर्भित नहीं करते हैं , बल्कि यूआई को अनफ्रेंड और उपयोगकर्ता कार्यों के लिए उत्तरदायी रखने के लिए अन्य कतारों पर करते हैं। यदि हम यूआई को अन्य कतारों में परिवर्तित होने देते हैं, तो परिवर्तन एक अलग और अप्रत्याशित अनुसूची और गति पर किए जा सकते हैं। कुछ UI तत्वों को उनकी आवश्यकता से पहले या बाद में खींचा जा सकता है। यह यूआई को क्रैश कर सकता है। हम यह भी है कि जब से ध्यान में रखने की जरूरत है वैश्विक कतारों हैं प्रणाली कतारों वहाँ कुछ अन्य कार्यों के लिए उन पर प्रणाली द्वारा चलाए जा सकते हैं।
सेवा की गुणवत्ता / प्राथमिकता
कतार भी अलग है QoS (सेवा की गुणवत्ता) जो कार्य सेट प्राथमिकता (उच्चतम से न्यूनतम करने के लिए यहाँ):
.userInteractive - मुख्य कतार
.userInitiated - उपयोगकर्ता द्वारा आरंभ किए कार्यों के लिए, जिस पर कुछ प्रतिक्रिया के लिए उपयोगकर्ता प्रतीक्षा करता है
.utility - कार्यों के लिए जो कुछ समय लगता है और तत्काल प्रतिक्रिया, जैसे डेटा के साथ काम करने की आवश्यकता नहीं है
.background - कार्यों के लिए जो दृश्य भाग के साथ संबंधित नहीं हैं और जिसके लिए पूरा होने के समय के लिए सख्त नहीं हैं)। .Default क्यू
भी है जो qos जानकारी को स्थानांतरित नहीं करता है। यदि qos का पता लगाना संभव नहीं था
qos का उपयोग .userInitiated और .utility के बीच किया जाएगा ।
कार्य समकालिक या असिंक्रोनस रूप से किए जा सकते हैं ।
कार्य समाप्त होने के बाद ही सिंक्रोनस फ़ंक्शन वर्तमान कतार में नियंत्रण लौटाता है। यह कतार को अवरुद्ध करता है और कार्य समाप्त होने तक प्रतीक्षा करता है।
असिंक्रोनस फ़ंक्शन कार्य को अलग-अलग कतार पर प्रदर्शन करने के लिए भेजे जाने के तुरंत बाद वर्तमान कतार पर नियंत्रण लौटाता है। यह कार्य पूरा होने तक प्रतीक्षा नहीं करता है। यह कतार को अवरुद्ध नहीं करता है।
आम परेशानियाँ।
सबसे लोकप्रिय गलतियाँ प्रोग्रामर करते हैं, जबकि समवर्ती ऐप्स को प्रोजेक्ट करना निम्नलिखित हैं:
- रेस की स्थिति - जब ऐप का काम कोड भागों के निष्पादन के आदेश पर निर्भर करता है।
- प्राथमिकता उलटा - जब कुछ संसाधनों के अवरुद्ध होने के कारण उच्च प्राथमिकता वाले कार्य छोटे प्राथमिकता वाले कार्यों के समाप्त होने की प्रतीक्षा करते हैं
- गतिरोध - जब कुछ कतारों में इन स्रोतों में से कुछ के लिए पहले से अवरुद्ध स्रोतों (चर, डेटा आदि) के लिए अनंत प्रतीक्षा होती है।
कभी भी मुख्य पंक्ति पर सिंक फ़ंक्शन को कॉल न करें ।
यदि आप मुख्य कतार में सिंक फ़ंक्शन को कॉल करते हैं, तो यह कतार को अवरुद्ध कर देगा और साथ ही कतार कार्य के पूरा होने की प्रतीक्षा कर रही होगी लेकिन कार्य कभी भी समाप्त नहीं होगा क्योंकि यह कतार के कारण शुरू करने में सक्षम नहीं होगा। पहले से ही अवरुद्ध है। इसे गतिरोध कहा जाता है ।
सिंक का उपयोग कब करें?
जब हमें कार्य समाप्त होने तक इंतजार करना होगा। Fe जब हम यह सुनिश्चित कर रहे हैं कि कुछ फ़ंक्शन / विधि डबल नहीं है। Fe का हमारे पास सिंक्रोनाइज़ेशन है और इसे तब तक रोकने की कोशिश की जा रही है जब तक कि यह पूरी तरह से समाप्त न हो जाए। इस चिंता के लिए यहां कुछ कोड दिया गया है:
IOS डिवाइस पर त्रुटि क्रैश रिपोर्ट का कारण क्या है?
DispatchQueue.main.sync
बैकग्राउंड थ्रेड से कॉल करना गलत होगा ?