2012-03-07 12 views
48

कुछ अन्य तरीकों से बीच, GCD में कतारों पाने के लिए इन दो तरीके हैं:जीसीडी में "वैश्विक कतार" और "मुख्य कतार" के बीच क्या अंतर है?

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

dispatch_get_main_queue(); 

अगर मैं पूरी तरह से गलत नहीं हूँ, "मुख्य कतार" मुख्य थ्रेड पर निष्पादित हो रहा है और "कॉलबैक के लिए अच्छा है "यूआई काम निष्पादित करने वाले ब्लॉक।

क्या इसका मतलब है "वैश्विक कतार" पृष्ठभूमि थ्रेड पर चलता है?

उत्तर

66

मुख्य कतार वास्तव में आपके जैसा मुख्य धागे पर चलती है।

वैश्विक कतारों समवर्ती कतारों कर रहे हैं और dispatch_get_global_queue के लिए मुख्य पृष्ठ से:

मुख्य कतार या कतारों dispatch_queue_create (साथ आवंटित), के विपरीत वैश्विक समवर्ती कतारों जैसे ही धागे के रूप में उपलब्ध हो जाते हैं अनुसूची ब्लॉक ("गैर-फीफो" समापन आदेश)।

 • DISPATCH_QUEUE_PRIORITY_HIGH 
     • DISPATCH_QUEUE_PRIORITY_DEFAULT 
     • DISPATCH_QUEUE_PRIORITY_LOW 

ब्लाकों उच्च प्राथमिकता वैश्विक कतार में सबमिट डिफ़ॉल्ट या कम प्राथमिकता वैश्विक कतारों को प्रस्तुत उन से पहले लागू किया जाएगा: वैश्विक समवर्ती कतारों तीन प्राथमिकता बैंड प्रतिनिधित्व करते हैं। कम प्राथमिकता वाली वैश्विक कतार में सबमिट किए गए ब्लॉक केवल होंगे यदि डिफ़ॉल्ट या उच्च प्राथमिकता वाले कतारों पर कोई ब्लॉक लंबित नहीं है।

तो, वे कतार हैं जो पृष्ठभूमि धागे पर चलते हैं और जब वे उपलब्ध होते हैं। वे "गैर-फीफो" हैं इसलिए ऑर्डरिंग की गारंटी नहीं है।

+0

क्या यह कहना सही है कि वैश्विक कतार समवर्ती कतार हैं और आप अपनी समवर्ती कतार ('dispatch_queue_create' या कुछ और के साथ) नहीं बना सकते हैं? –

7

हां। आप इसे परीक्षण करने के लिए एक डिवाइस पर इस तरह कोड चला सकते हैं:

dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      NSLog(@"Block 1a"); 
      NSAssert(![NSThread isMainThread], @"Wrong thread!"); 
      NSLog(@"Block 1b"); 
     }); 
dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      dispatch_async(dispatch_get_main_queue(), ^{ 
        NSLog(@"Block 2a"); 
        NSAssert([NSThread isMainThread], @"Wrong thread!"); 
        NSLog(@"Block 2b"); 
       }); 
     }); 
21

5 कतारों (4 पृष्ठभूमि, 1 मुख्य) सभी विभिन्न धागा प्राथमिकताओं (-[NSThread threadPriority]) है भी:

      -main- : 0.758065 
     DISPATCH_QUEUE_PRIORITY_HIGH : 0.532258 
    DISPATCH_QUEUE_PRIORITY_DEFAULT : 0.500000 
     DISPATCH_QUEUE_PRIORITY_LOW : 0.467742 
DISPATCH_QUEUE_PRIORITY_BACKGROUND : 0.000000 

(पर परीक्षण किया एक आइपॉड 4 जनरल और पर एक मैकबुक प्रो सिम्युलेटर)

1

वैश्विक प्रेषण कतार:

  1. समवर्ती कतार पूर्व में कार्य ecutes समवर्ती [पृष्ठभूमि धागे]
  2. कार्य अभी भी क्रम में शुरू कर रहे हैं कि वे कतार में जोड़ा गया

मुख्य प्रेषण कतार:

  1. उपलब्ध धारावाहिक कतार उस पर कार्य निष्पादित करता है आवेदन के मुख्य धागा।
  2. इसे आमतौर पर पृष्ठभूमि कतार से बुलाया जाता है जब कुछ पृष्ठभूमि प्रसंस्करण समाप्त हो गया है और उपयोगकर्ता इंटरफ़ेस को अपडेट किया जाना चाहिए।
संबंधित मुद्दे