7

मेरे पास दो GCD ब्लॉक हैं जो एसिंक हैं। पहला पृष्ठभूमि धागा के लिए है, मुख्य धागे पर दूसरा रन। यह बहुत अच्छा काम करता है, लेकिन मैंने अभी कहीं बात की है कि मुझे dispatch_release() का उपयोग करके उन्हें रिलीज़ करने की आवश्यकता हो सकती है। उदा .:dispatch_queue_t dispatch_release() का उपयोग करके रिलीज़ होने की आवश्यकता है?

// Use gcd 
dispatch_queue_t queue = dispatch_queue_create("com.awesome", 0); 
dispatch_queue_t main = dispatch_get_main_queue(); 

// do the long running work in bg async queue 
// within that, call to update UI on main thread. 
dispatch_async(queue, ^{ 
    // Do work in the background 



    // Release 
    dispatch_release(queue); 

    dispatch_async(main, ^{ 

     // Main 


     // Release 
     dispatch_release(main); 

    });//end 
});//end 

क्या यह सच है? क्या मुझे उन्हें यहां छोड़ने की ज़रूरत है?

+0

हेडर फ़ाइल में टिप्पणियों के अनुसार आपको अपनी कतार पर dispatch_release() को आमंत्रित करने की आवश्यकता है। – BonanzaDriver

उत्तर

8

केवल आपके द्वारा बनाई गई कतार जारी करें; मुख्य कतार या वैश्विक समवर्ती कतारों को जारी न करें (या फिर, कोई भी जिसे आपने स्वयं नहीं बनाया है)। यह भी घोंसला काम ब्लॉक के भीतर रिलीज कि कतार पर कतारबद्ध, के रूप में आप कर रहे हैं करने के लिए एक अच्छा विचार नहीं है, क्योंकि वह गलत दायरे में यह कर रही है और इस:

queue = dispatch_queue_create(...) 
dispatch_async(queue, ^{ something; dispatch_release(queue); }); 
dispatch_async(queue, ^{ something else}); // CRASH! 

जब आप बाद में काम नहीं करेंगे कोड को दूसरे dispatch_async() जोड़ने के लिए बदलें। हमेशा एक ही दायरे में अपने निर्माण/रिलीज कॉल को जोड़ना, यह मानते हुए कि आप कर सकते हैं, एक बेहतर स्टाइलिस्ट पसंद है।

+0

ठीक है, तो मुझे इसे dispatch_asynch कॉल के बाहर छोड़ने की आवश्यकता है? –

+0

हां। विशेष रूप से, आपको इसे उसी दायरे में करने की आवश्यकता होती है जैसे कि कॉल कॉल, ताकि आप अपने लिए भूमि-खदान सेट कर सकें, जिसे आपने बाद में कदम रखा है, जैसा कि मैंने अपने उत्तर में दिखाया है (इस नियम का एकमात्र अपवाद अंतिमकर्ता हो सकता है, लेकिन चलिए नहीं चीजों को भ्रमित करें :)) – jkh

13

आपको केवल dispatch_queue_create के साथ बनाई गई कतार को रिलीज़ करने की आवश्यकता है। मुख्य कतार हमेशा मौजूद रहेगी, और इसे जारी करने के लिए यह समझ में नहीं आता है।

कतार में जोड़े गए कोई भी ब्लॉक कतार को बनाए रखेगा, ताकि आप अपने dispatch_async कॉल के बाद सुरक्षित रूप से dispatch_release(queue) पर कॉल कर सकें। आपके द्वारा यहां लिखे गए कोड के बाद ब्लॉक के बाहर ऐसा करने के लिए सबसे अच्छा है।

+0

ठीक है, लेकिन अगर मैं इसे कतार के बाहर करता हूं, तो क्या यह स्वचालित रूप से रिलीज़ नहीं होगा? –

+2

@NicHubbard यह सभी कतार का काम पूरा होने पर जारी हो जाएगा, उदाहरण के लिए आप एक कतार बना सकते हैं, इसे 3 - 4 ब्लॉक भेज सकते हैं, और प्रेषण कॉल के बाद इसे छोड़ सकते हैं। कतार तब तक बरकरार रहेगी जब तक सभी ब्लॉक अपने संबंधित कार्यों को पूरा नहीं कर लेते। इस बिंदु पर आपको अब इस कतार की आवश्यकता नहीं है। – Pochi

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

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