23

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

मेरी इच्छा एक नया कतार dispatch_create_queue का उपयोग कर, मैं दो ब्लॉकों कि मुख्य थ्रेड पर चलाने के लिए नहीं हैं जोड़ना होगा कि कौन सा बनाने के लिए था, लेकिन एक सीरियल ढंग से, जिसका अर्थ है पहले पहले खंड को चलाने के लिए है, फिर दूसरा, और समानांतर में कभी नहीं।

मैंने सेब दस्तावेज पढ़ा है, लेकिन यह कम से कम कहने में भ्रमित है।

  • जब मैं dispatch_queue_create का उपयोग कर और फिर ब्लॉक जोड़ (के बाद वे परिभाषित किया गया है) dispatch_sync उपयोग करते हुए मेरे कतार बना, मुझे पता चला है कि ब्लॉक अभी भी मुख्य थ्रेड पर निष्पादित हो रहा है।

  • dispatch_async का उपयोग करते समय, जब ब्लॉक मुख्य धागे पर निष्पादित नहीं होते हैं।

  • जब मैं dispatch_sync का उपयोग करके दोनों ब्लॉक जोड़ने की कोशिश करता हूं तो वे हमेशा के लिए अवरुद्ध हो जाते हैं।

  • एकमात्र समय जब दोनों ब्लॉक ठीक से चलते हैं और मुख्य धागे से बाहर होते हैं तो dispatch_async पर कॉल करते समय होता है।

हालांकि कारण है कि मैं GCD और सिंक विधि चुना ताकि मैं धारणा है कि मैं एक नई पंक्ति (और इस तरह एक नया धागा) का निर्माण कर रहा तहत और कहा कि था कि कतार में ब्लॉक जोड़ने बस एक ब्लॉक कर देगा जब तक कि दूसरे ने निष्पादन समाप्त नहीं किया था। क्या यह मामला नहीं है, या कोई कतार बनाने से यह गारंटी नहीं है कि कोड मुख्य धागे पर नहीं चलेगा?

उत्तर

50

यह GCD में एक फीफो कतार है:

dispatch_queue_t serialQueue = dispatch_queue_create("com.blah.queue", DISPATCH_QUEUE_SERIAL); 

... 
dispatch_async(serialQueue, ^{ 
    //block1 
}); 

dispatch_async(serialQueue, ^{ 
    //block2 
}); 
+0

तो यह तो dispatch_sync कोई लेना देना नहीं है? इसे बनाने के दौरान केवल ध्वज इस्तेमाल किया जाता है? –

+5

dispatch_async इसे बनाता है ताकि ब्लॉक समाप्त होने तक प्रेषण कॉल स्वयं ब्लॉक न हो। यदि आप dispatch_sync का उपयोग करते हैं, तो कार्य स्वयं को कतार में जो कुछ भी थ्रेड में निष्पादित किया जाता है, लेकिन जब तक कार्य पूरा नहीं हो जाता तब तक आप वर्तमान धागे को अवरुद्ध कर देते हैं। मुझे नहीं लगता कि आपको यही चाहिए। –

+0

धन्यवाद, उन एपीआई नाम थोड़ा उलझन में हैं। मेरा दिन बचाया! :) –