2011-07-26 14 views
5

मैं एक कॉल करना चाहते हैं एसिंक्रोनस रूप के बराबर होते हैं,:मैं एक एसिंक्रोनस कॉल को लात मारने के लिए ग्रांड सेंट्रल डिस्पैच का उपयोग कैसे करूं?

doThisInASecondThreadThenHaveThisThreadDisappear:@selector(myMethod);

क्या ग्रांड सेंट्रल डिस्पैच कॉल यह पूरा करने की जाती है? मैं इसके लिए नया हूं और मैं कतार के साथ सभी जटिल सामानों के साथ खो गया हूं। मैं चीजें हैं जो उस के साथ प्राप्त किया जा सकता समझते हैं, लेकिन इस सरल मामले (कि मैं वर्तमान के बारे में परवाह) के लिए मैं सिर्फ

उत्तर

5
dispatch_queue_t queue = dispatch_queue_create("queueName", NULL); 
dispatch_async(queue, ^(void) { 
    // code to execute here 
}); 
dispatch_release(queue); 

खो रहा हूँ या आप मुख्य थ्रेड उपयोग करने की आवश्यकता है, तो:

dispatch_async(dispatch_get_main_queue(), ^(void) { 
     // code to execute here 
}); 
+3

तुम भी बजाय एक कतार बनाने के वैश्विक समवर्ती कतारों में से एक प्राप्त करने के लिए 'dispatch_get_global_queue' का उपयोग कर सकते है। यह बेहतर हो सकता है क्योंकि आपको कोई मेमोरी प्रबंधन नहीं करना है। – zneak

+0

@zneak क्या आप बिल्कुल वैसा ही विस्तार कर सकते हैं जो वे दिखेंगे? – Nektarios

+0

'dispatch_queue_t queue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_NORMAL, 0);' – zneak

3

यहां एक त्वरित कोड उदाहरण

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);  
dispatch_async(queue, ^{ 
    // Stuff to do on another thread 
    // Mostly heavy calculations 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Stuff to do on main thread 
     // Mostly UI stuff 
    });      
});  
+6

वैश्विक कतार जारी नहीं होने की आवश्यकता है, अंतिम कॉल एक एनओपी है (और आप किसी युग्मन प्रेषण को किसी भी तरह से पैडेंट मोड में खो देंगे)। –

+0

@Grzegorz Adam Hankiewicz, जानकारी के लिए धन्यवाद! – Tudorizer

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