DISPATCH_QUEUE_PRIORITY_X कतार में से सभी समवर्ती कतारें हैं (जिसका अर्थ है कि वे एक साथ कई कार्यों को निष्पादित कर सकते हैं), और FIFO इस अर्थ में हैं कि किसी दिए गए कतार के भीतर कार्य "पहले, पहले बाहर" क्रम का उपयोग करके निष्पादित करना शुरू कर देंगे। यह मुख्य कतार (dispatch_get_main_queue () से) की तुलना में है, जो एक सीरियल कतार है (कार्य उस क्रम में निष्पादित और समाप्त करना शुरू कर देंगे जिसमें वे प्राप्त होते हैं)।
इसलिए, यदि आप DISPATCH_QUEUE_PRIORITY_DEFAULT को 1000 प्रेषण_सुंक () ब्लॉक भेजते हैं, तो वे कार्य आपके द्वारा कतार में भेजे गए क्रम में निष्पादित होने लगेंगे। इसी तरह हाई, लो और बैकग्राउंड कतारों के लिए। इन कतारों में आप जो भी भेजते हैं, वह आपके मुख्य एप्लिकेशन थ्रेड से दूर, वैकल्पिक थ्रेड पर पृष्ठभूमि में निष्पादित होता है। इसलिए, ये कतारें पृष्ठभूमि डाउनलोडिंग, संपीड़न, गणना, आदि जैसे कार्यों को निष्पादित करने के लिए उपयुक्त हैं।
ध्यान दें कि निष्पादन का क्रम प्रति पंक्ति के आधार पर FIFO है। इसलिए यदि आप चार अलग-अलग समवर्ती कतारों में 1000 प्रेषण_संकट () कार्य भेजते हैं, तो समान रूप से उन्हें विभाजित करें और उन्हें BACKGROUND, LOW, DEFAULT और HIGH के क्रम में भेजें (यानी आप उच्च कतार पर अंतिम 250 कार्य शेड्यूल करते हैं), यह बहुत संभावना है कि पहला कार्य जो आप देख रहे हैं, वह उस उच्च कतार पर होगा क्योंकि सिस्टम ने आपके निहितार्थ को ले लिया है कि उन कार्यों को जितनी जल्दी हो सके सीपीयू में लाने की आवश्यकता है।
यह भी ध्यान दें कि मैं कहता हूं कि "क्रम में क्रियान्वयन शुरू हो जाएगा", लेकिन ध्यान रखें कि समवर्ती कतारों के रूप में आवश्यक रूप से प्रत्येक कार्य के लिए समय की लंबाई के आधार पर निष्पादित करना आवश्यक नहीं होगा।
Apple के अनुसार:
https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
समवर्ती प्रेषण कतार उपयोगी है जब आपके पास कई कार्य हैं जो समानांतर में चल सकते हैं। एक समवर्ती कतार अभी भी एक कतार है जिसमें यह पहले-पहले, पहले-क्रम में कार्यों को समाप्त करता है; हालाँकि, एक समवर्ती कतार किसी भी पिछले कार्य को पूरा करने से पहले अतिरिक्त कार्यों को समाप्त कर सकती है। किसी भी समय एक समवर्ती कतार द्वारा निष्पादित कार्यों की वास्तविक संख्या परिवर्तनशील होती है और आपके एप्लिकेशन परिवर्तन की स्थितियों में गतिशील रूप से बदल सकती है। कई कारक समवर्ती कतारों द्वारा निष्पादित कार्यों की संख्या को प्रभावित करते हैं, जिनमें उपलब्ध कोर की संख्या, अन्य प्रक्रियाओं द्वारा किए जा रहे कार्य की मात्रा और अन्य सीरियल प्रेषण कतारों में कार्यों की संख्या और प्राथमिकता शामिल है।
मूल रूप से, यदि आप उन 1000 प्रेषण_सुंक () ब्लॉक को एक DEFAULT, HIGH, LOW, या BACKGROUND कतार में भेजते हैं तो वे सभी आपके द्वारा भेजे जाने वाले क्रम में क्रियान्वित होने लगेंगे। हालाँकि, छोटे कार्य अधिक समय से पहले समाप्त हो सकते हैं। इसके पीछे कारण यह हैं कि यदि उपलब्ध सीपीयू कोर हैं या यदि वर्तमान कतार के कार्य कम्प्यूटेशनल रूप से गैर-गहन कार्य कर रहे हैं (इस प्रकार सिस्टम को लगता है कि यह कोर काउंट की परवाह किए बिना समानांतर में अतिरिक्त कार्यों को भेज सकता है)।
समसामयिकता का स्तर पूरी तरह से सिस्टम द्वारा नियंत्रित किया जाता है और सिस्टम लोड और अन्य आंतरिक रूप से निर्धारित कारकों पर आधारित होता है। यह ग्रैंड सेंट्रल डिस्पैच (डिस्पैच_सुंक () सिस्टम) की सुंदरता है - आप बस अपनी कार्य इकाइयों को कोड ब्लॉक बनाते हैं, उनके लिए प्राथमिकता तय करते हैं (आपके द्वारा चुनी गई कतार के आधार पर) और सिस्टम को बाकी को संभालने दें।
इसलिए अपने उपरोक्त प्रश्न का उत्तर देने के लिए: आप आंशिक रूप से सही हैं। आप निर्दिष्ट प्राथमिकता स्तर पर वैश्विक समवर्ती कतार पर समवर्ती कार्य करने के लिए "उस कोड को पूछ रहे हैं"। ब्लॉक में कोड पृष्ठभूमि में निष्पादित होगा और कोई भी अतिरिक्त (समान) कोड सिस्टम में उपलब्ध संसाधनों के मूल्यांकन के आधार पर समानांतर में संभावित रूप से निष्पादित करेगा।
दूसरी ओर "मुख्य" कतार (प्रेषण_गेट_मैं_क्व्यू () से) एक धारावाहिक कतार है (समवर्ती नहीं)। मुख्य कतार में भेजे गए कार्य हमेशा क्रम में निष्पादित होंगे और हमेशा क्रम में समाप्त होंगे। ये कार्य UI थ्रेड पर भी निष्पादित किए जाएंगे, इसलिए यह आपके UI को प्रगति संदेशों, पूर्ण सूचनाओं आदि के साथ अपडेट करने के लिए उपयुक्त है।
dispatch_get_global_queue
एक चर प्रकार के अंदर अपने को सुरक्षित करेंdispatch_queue_t myQueue
। इसके अधिक पठनीय केवल myQueue को आपके `` dispatch_async` पास करना