2012-12-16 15 views
8

संभव डुप्लिकेट:
What is the difference between dispatch_get_global_queue and dispatch_queue_create?वैश्विक कतार और उपयोगकर्ता कतारों के बीच क्या अंतर है?

मैं gcd का उपयोग कर कुछ तरीकों को देखते हैं, लेकिन उनमें से कुछ इसे इस तरह कर सकते हैं:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 
dispatch_async(queue, ^{ 

    dispatch_sync(dispatch_get_main_queue(), ^{ 

    }); 
}); 

लेकिन दूसरों को ऐसा लगता है कि ऐसा कर सकते हैं इस:

imageQueue_ = dispatch_queue_create("com.company.app.imageQueue", NULL); 
dispatch_async(imageQueue_, ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 

     }); 
    }); 

अंतर क्या है? अगर मैं वेब से कई छवियां डाउनलोड करना चाहता हूं, तो बेहतर है?

उत्तर

19

कतारों की अवधारणा का सबसे अच्छा तरीका पहले एहसास है कि बहुत कम स्तर पर है, वहाँ कतारों केवल दो प्रकार के होते हैं।

सीरियल कतार एकरूप हैं, लेकिन असामान्य हैं। यदि आप प्रत्येक सीरियल कतार में कार्यों का एक गुच्छा देते हैं, तो यह एक समय में केवल एक ही थ्रेड का उपयोग करके उन्हें एक बार चलाएगा। असामान्य पहलू यह है कि धारावाहिक कतार कार्यों के बीच एक अलग थ्रेड पर स्विच कर सकते हैं। सीरियल कतार हमेशा अगले कार्य पर जाने से पहले एक कार्य खत्म होने की प्रतीक्षा करते हैं। इस प्रकार कार्य एफआईएफओ आदेश में पूरा हो गए हैं। आपको जितनी जरूरत हो उतनी सीरियल कतार बना सकते हैं।

मुख्य कतार एक विशेष धारावाहिक कतार है। अन्य धारावाहिक कतारों के विपरीत, जो कि असामान्य हैं, उनमें वे कई धागे "डेटिंग" कर रहे हैं, लेकिन समय पर केवल एक ही, मुख्य कतार मुख्य धागे पर "विवाहित" है और सभी कार्यों को इस पर किया जाता है। मुख्य कतार मुख्य धागे के रनलोप के साथ अच्छी तरह से व्यवहार करती है ताकि छोटे ऑपरेशन यूआई और अन्य महत्वपूर्ण बिट्स को अवरुद्ध न करें। सभी धारावाहिक कतारों की तरह, एफआईएफओ आदेश में कार्य पूरा हो जाते हैं।

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

इसे वापस लाना, सभी वैश्विक कतारों समवर्ती हैं और सभी उपयोगकर्ता कतारों धारावाहिक हैं।

यदि आपका लक्ष्य छवियों को डाउनलोड करना है, तो आप शायद एक सीरियल (उपयोगकर्ता) कतार चाहते हैं। छवियों को डाउनलोड करना बैंडविड्थ की अधिक चीज़ है। आप आमतौर पर एक समय में केवल एक (या कुछ) करना चाहते हैं।

संपादित: ब्लॉग पोस्ट के ऊपर जवाब पर विस्तार: महान उत्तर के लिए http://amattn.com/2013/08/28/grand_central_dispatch_gcd_summary_syntax_best_practices.html

+0

आपके उत्तर के लिए धन्यवाद! – Jackie

+0

मेरे अनुभव से, यह उत्तर सटीक नहीं है। उपयोगकर्ता कतार एक समवर्ती कतार के रूप में (और फ़ंक्शन) बनाया जा सकता है। – Guy

3

आप आप नौकरी पर कार्रवाई करने के लिए स्वचालित रूप से पर्याप्त धागे पैदा करेगा, और कई कोर का उपयोग करता है, तो संभव dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); GCD का उपयोग करते हैं।

दूसरी ओर, यदि आप का उपयोग imageQueue_ = dispatch_queue_create("com.company.app.imageQueue", NULL); आप एक सीरियल कतार और एक प्रथम में प्रथम आउट व्यवहार मिलता है।

आप धागे की सुरक्षा या जिस क्रम में अपनी नौकरी वापसी के बारे में चिंतित नहीं हैं, तो पहली विधि का उपयोग। धारावाहिक और समवर्ती:

+0

धन्यवाद। तो, कहें कि आप डेटाविथकंट्सऑफ्लर का उपयोग करके कुछ जेसन प्राप्त करने के लिए बस सर्वर से कनेक्ट कर रहे हैं:। आप किस का उपयोग करेंगे - पहला वाला? वापसी आदेश के बारे में कोई चिंता नहीं है; और मुझे लगता है कि कोई थ्रेड-सुरक्षा चिंता नहीं है। तो - बस वैश्विक कतार का उपयोग करें? {शायद डिफ़ॉल्ट प्राथमिकता के साथ} चीयर्स! – Fattie

+1

"अगर आप धागे की सुरक्षा के बारे में चिंतित नहीं हैं" - हमेशा थ्रेड-सुरक्षा के बारे में चिंतित होना चाहिए! – Maq

संबंधित मुद्दे