2017-12-05 15 views
5

मुझे कुछ कोड मिला है जिसमें यह असामान्य नेस्टेड अनुक्रम है। सामान्य प्रतिमान यूआई को अद्यतन करने के लिए मुख्य कतार में एक प्रेषण होगा। नीचे दिखाया गया कोड, मुख्य कतार में एक अन्य प्रेषण के भीतर मुख्य कतार में एक प्रेषण घोंसला करता है।प्रेषण dispatch_async (dispatch_get_main_queue()^{}) का घोंसला का उद्देश्य क्या है?

- (void)viewDidLoad 
{ 
// Setup some data 
// Adjust UI 

dispatch_async(myBackgroundQueue, ^{ 
    while(Do_some_time_consuming_work) { 

    // Time consuming work goes here 

    if (things_are_going_slowly) { 

     dispatch_async(dispatch_get_main_queue(), ^{ // <- one of these two seems redundant 
      dispatch_async(dispatch_get_main_queue(), ^{ // <- one of these two seems redundant 

      stillWorkingLabel.hidden = NO; //Let user know the work is still ongoing 
      }); 
     }); 
    ) 

    // Finish time-consuming work 
    } 

    }); 

} 

क्या उद्देश्य है, यदि कोई dispatch_async(dispatch_get_main_queue() घोंसले की है? यह नेस्टेड अनुक्रम ऐप में कई स्थानों पर दिखाई देता है। ऐसा लगता है कि मुख्य कतार में केवल एक प्रेषण की आवश्यकता है।

मुझे लगता है कि मैंने यहां संबंधित विषयों पर और Google खोज के माध्यम से संबंधित सभी प्रासंगिक प्रश्न पढ़े हैं, लेकिन मुझे किसी को भी दो समान प्रेषण घोंसले का सुझाव नहीं मिला है।

ऐप उपरोक्त उदाहरण में और कोड के अन्य स्थानों में अपेक्षित यूआई अपडेट के साथ अच्छी तरह से काम करता है।

अधिकांश ऐप का कोड उपरोक्त योजना के सामान्य गैर-नेस्टेड संस्करण का उपयोग करता है, और निश्चित रूप से यह भी ठीक काम करता है।

मैं इन नेस्टेड कॉल को केवल एक प्रेषण के साथ प्रतिस्थापित करने के इच्छुक हूं, लेकिन हो सकता है कि मैं यहां कुछ खो रहा हूं। किसी भी सलाह की सराहना की जाएगी।

उत्तर

2

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

मुझे लगता है कि नेस्टेड कॉल को हटाने का सही काम है।

0

मुख्य लिए दो dispatch_queues घोंसले के शिकार कोई मतलब नहीं है, सीधे आगे रास्ता है कि

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

// perform long task here 

dispatch_async(dispatch_get_main_queue(), ^(){ 

    //Add method, task you want perform on mainQueue 
//Control UIView, IBOutlet all here 

}); }); 
संबंधित मुद्दे