29

एप्पल के ग्रांड सेंट्रल डिस्पैच संदर्भ का कहना है:मुझे एनएसओपेरेशन पर जीसीडी क्यों चुनना चाहिए और उच्च स्तरीय अनुप्रयोगों के लिए ब्लॉक क्यों करना चाहिए?

"... अपने आवेदन प्रणाली-उदाहरण के लिए यूनिक्स स्तर पर संचालित करने के लिए, अगर यह फ़ाइल वर्णनकर्ता, मच बंदरगाहों, संकेतों में हेरफेर करने की जरूरत की जरूरत है , या टाइमर। GCD सिस्टम स्तर को अनुप्रयोगों ही सीमित नहीं है, लेकिन इससे पहले कि आप उच्च स्तर के अनुप्रयोगों के लिए इसका इस्तेमाल करते हैं, तो आप पर विचार करना चाहिए ( NSOperation और ब्लॉक वस्तुओं के माध्यम से) कोको में उपलब्ध कराई गई इसी तरह की सुविधा का उपयोग करने के आसान होगा कि क्या है या आपकी जरूरतों के लिए उपयुक्त । "

http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

मैं वास्तव में स्थितियों के बारे में सोच नहीं सकते हैं, उच्च स्तर के अनुप्रयोगों के लिए, जिसमें GCD के उपयोग अनिवार्य है और NSOperation/नहीं किया जाना चाहिए सकता है।

कोई विचार?

+0

https: // कोकोकास्ट्स।कॉम/चुनने के बीच-nsoperation-and-grand-central-dispatch/ – Masih

उत्तर

50

यहां मुद्दा बनाया जा रहा है वही है कि क्रिस हैन्सन ने अपने लेख "When to use NSOperation vs. GCD" में कहा गया है:

हमेशा उपयोग करें:

सीधा जवाब सभी आवेदन विकास के लिए एक सामान्य दिशानिर्देश है आपके लिए उच्चतम स्तर का अबास्ट्रक्शन उपलब्ध है, और माप आवश्यक होने पर को निम्न-स्तरीय अवशेषों तक छोड़ दें।

इस विशेष मामले में, इसका मतलब है कि कोको अनुप्रयोगों को लिखते समय, आपको आम तौर पर जीसीडी का उपयोग करके के बजाय NSOperation का उपयोग करना चाहिए। इसलिए नहीं कि दक्षता में एक फर्क है, लेकिन क्योंकि NSOperation एक उच्च स्तरीय अमूर्त GCD की तंत्र के ऊपर प्रदान करता है।

सामान्य तौर पर, मैं इस बात से सहमत।NSOperation और NSOperationQueue निर्भरताओं और एक या दो अन्य चीजों के लिए समर्थन प्रदान करते हैं जो जीसीडी ब्लॉक और कतारों के पास नहीं हैं, और वे समवर्ती परिचालनों को लागू करने के तरीके के निचले स्तर के विवरण को दूर करते हैं। यदि आपको उस कार्यक्षमता की आवश्यकता है, तो NSOperation जाने का एक बहुत अच्छा तरीका है।

हालांकि, दोनों के साथ काम करने के बाद, मैंने खुद को अपने सभी एनएसओपरेशन-आधारित कोड को जीसीडी ब्लॉक और कतारों के साथ बदल दिया है। मैंने इसे दो कारणों से किया है: अक्सर कार्यवाही के लिए एनएसओपरेशन का उपयोग करते समय महत्वपूर्ण ओवरहेड होता है, और मेरा मानना ​​है कि मेरा कोड क्लीनर और जीसीडी ब्लॉक का उपयोग करते समय अधिक वर्णनात्मक है।

पहला कारण मेरे अनुप्रयोगों में प्रोफाइलिंग से आता है, जहां मैंने पाया कि एनएसओपरेशन ऑब्जेक्ट आवंटन और डिलोक्शन प्रक्रिया ने छोटे और लगातार कार्यों से निपटने के दौरान सीपीयू संसाधनों की एक बड़ी मात्रा ली, जैसे स्क्रीन पर ओपनजीएल ईएस फ्रेम को प्रस्तुत करना। जीसीडी ब्लॉक ने पूरी तरह से ओवरहेड को हटा दिया, जिससे महत्वपूर्ण प्रदर्शन सुधार हुआ।

दूसरा कारण अधिक व्यक्तिपरक है, लेकिन मुझे विश्वास है कि NSOperations की तुलना में ब्लॉक का उपयोग करते समय मेरा कोड क्लीनर है। ब्लॉक द्वारा अनुमत दायरे का त्वरित कब्जा और उनमें से इनलाइन प्रकृति कम कोड बनाती है, क्योंकि आपको ऑपरेशन में पारित होने के लिए कस्टम एनएसओपरेशन सबक्लास या बंडल पैरामीटर बनाने की आवश्यकता नहीं है, और मेरी राय में अधिक वर्णनात्मक कोड, क्योंकि आप उस बिंदु पर कतार में चलाने के लिए कोड डाल सकते हैं जहां इसे निकाल दिया जाता है।

फिर से, यह वरीयता का मामला है, लेकिन मैंने खुद को अन्यथा अधिक समेकित कोको अनुप्रयोगों में भी जीसीडी का उपयोग करके पाया है।

+0

NSOperationQueue अब बंद करने का उपयोग करने में सक्षम है। क्या यह उत्तर (थोड़ा) अपडेट किया जाना चाहिए? साथ ही, क्या कोई मौका है कि पिछले 5 वर्षों में एनएसओपरेशन को आपके द्वारा प्राप्त ओवरहेड को कम करने के लिए अनुकूलित किया गया है? –

+0

मुझे यह जोड़ना चाहिए कि मैंने सटीक विपरीत कर दिया है - जीसीडी का उपयोग करने के वर्षों के बाद सीधे, NSOperationQueue पर स्विचिंग ताजा हवा का सांस था। मेरा 'क्यूइंग' व्यवहार अब अच्छी तरह से परिभाषित है, और मेरे पास अधिकतम समवर्ती संचालन पर पूर्ण नियंत्रण है। चल रहे संचालन को रद्द करना और उन्हें नए लोगों के साथ बदलना भी आसान है, जिसके परिणामस्वरूप अच्छी तरह परिभाषित व्यवहार होता है। मैं अभी भी सरल एसिंक ऑपरेशंस के लिए जीसीडी का उपयोग करता हूं, लेकिन मैंने अपने सीरियल/एसिंक क्यूइंग की ज़रूरतों के लिए एनएसओपेरेशन क्यूयू में स्विच किया है। – strangetimes

+0

अच्छी व्याख्या के लिए उपरोक्त। – user3182143

4

ठीक है, एनएसओपरेशन में dispatch_source_t, dispatch_io, dispatch_data_t, dispatch_semaphore_t, आदि के लिए कोई समकक्ष नहीं है ... यह कुछ हद तक ऊपरी ओवरहेड भी है।

दूसरा पहलू पर, libdispatch आपरेशन निर्भरता, आपरेशन प्राथमिकताओं के लिए कोई समकक्ष है (कतार प्राथमिकताओं कुछ अलग हैं), या KVO कार्यों पर।

+1

'NSOperation' अब 'जीसीडी' के शीर्ष पर बनाया गया है, इसलिए जब तक कि उसमें कुछ ऐसा न हो जो आपको चाहिए तो दूसरे में नहीं है दूसरे के पक्ष में बहुत अधिक है। – hypercrypt

+1

इसे अभी भी अन्य जटिलताओं के साथ संचालन के लिए ऑब्जेक्ट आवंटन की आवश्यकता है। बेहद सुगंधित थ्रेडिंग के लिए जो वास्तव में एक सार्थक उपरि हो सकता है। हाँ, मैंने इसे माप लिया है; हाँ यह मेरे कुछ कोड के लिए महत्वपूर्ण है। जीसीडी का एनएसओपरेशन का रैपिंग बिल्कुल सरल मैपिंग नहीं है, जो उम्मीद कर सकता है, क्योंकि इसे निर्भरताओं, केवीओ और प्राथमिकताओं का समर्थन करने की आवश्यकता है। –

+0

वह सही है, मैंने अक्सर होने वाली कार्रवाइयों के लिए NSOperation का उपयोग करने में महत्वपूर्ण ओवरहेड भी देखा है जहां मुझे यह नहीं लगता कि जीसीडी ब्लॉक के साथ। ऑब्जेक्ट आवंटन/डीलोकेशन उन मामलों में बहुत महंगा हो सकता है, इसलिए जीसीडी अधिक उपयुक्त हो सकती है। –

0

मैं वास्तव में सिर्फ 'पढ़ने किया गया है इस बारे में दौर, और, मुझे यकीन है कि यह के रूप में आ जाएगा आश्चर्य पता हूँ, राय भिन्न होते हैं।

मैं एक मामला आप NSOperation से अधिक GCD उपयोग करने के लिए होगा जहां के बारे में सोच नहीं सकते हैं, लेकिन इसका मतलब यह नहीं है कि इस तरह के मामले मौजूद नहीं है। हालांकि, मैं सर्वोत्तम अभ्यास कोडिंग के मामले में एक सामान्य भावना से सहमत हूं:

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

13
  • GCD पसंद करते हैं जहां काम बहुत जटिल नहीं है और इष्टतम सीपीयू प्रदर्शन की आवश्यकता है।
  • NSOperationQueue को पसंद करें जहां कार्य जटिल है और ब्लॉक और निर्भरता प्रबंधन को रद्द या निलंबित करने की आवश्यकता है

जीसीडी एक साथ काम करने वाली इकाइयों का प्रतिनिधित्व करने का हल्का तरीका है जो एक साथ निष्पादित किए जा रहे हैं। आप काम की इन इकाइयों को निर्धारित नहीं करते हैं; प्रणाली आपके लिए शेड्यूलिंग का ख्याल रखती है। ब्लॉक के बीच निर्भरता जोड़ना सिरदर्द हो सकता है। किसी ब्लॉक को रद्द करना या निलंबित करना आपके लिए एक डेवलपर के रूप में अतिरिक्त काम बनाता है!

एनएसओपरेशन और एनएसओपरेशनक्यूयू जीसीडी की तुलना में थोड़ा अतिरिक्त ओवरहेड जोड़ते हैं, लेकिन आप विभिन्न परिचालनों के बीच निर्भरता जोड़ सकते हैं। आप संचालन का पुन: उपयोग, रद्द या निलंबित कर सकते हैं। एनएसओपरेशन कुंजी-मूल्य निरीक्षण (केवीओ) के साथ संगत है; उदाहरण के लिए, आप NSNotificationCenter को सुनकर एनएसओपरेशन शुरू कर सकते हैं।

विस्तृत विवरण के लिए, इस सवाल का संदर्भ लें: NSOperation vs Grand Central Dispatch

1

वहाँ दो चीजें हैं जो NSOperationQueue कि GCD नहीं करता है कर सकते हैं: नाबालिग एक निर्भरता है (एक कतार के लिए एक ऑपरेशन जोड़ते हैं, लेकिन करने के लिए कह ही निष्पादित जब कुछ अन्य परिचालन समाप्त हो जाते हैं), और बड़ा यह है कि एनएसओपरेशन आपको एक ऑब्जेक्ट देता है जो कार्य निष्पादित करते समय संदेशों को प्राप्त कर सकता है, जीसीडी के विपरीत जिनके पास ब्लॉक बहुत सीमित तरीके से छोड़कर संदेश प्राप्त नहीं कर सकते हैं। आपको या तो इन दो विशेषताओं की आवश्यकता है, या आप नहीं करते हैं। यदि आप नहीं करते हैं, तो जीसीडी का उपयोग करना बहुत ही आसान है।

यही कारण है कि एनएसओपरेशन के उपयोगी उदाहरण हमेशा जटिल होते हैं। अगर वे आसान थे, तो आप इसके बजाय जीसीडी का उपयोग करेंगे। आप आमतौर पर एनएसओपरेशन का उप-वर्ग बनाते हैं, जो कुछ महत्वपूर्ण काम होगा, या किसी और ने बनाया है।

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