2010-06-15 22 views
29

पर वर्तमान में मैं NSThread का उपयोग किसी अन्य थ्रेड में छवियों को कैश करने के लिए कर रहा हूं।एनएसटीएचएड बनाम NSOperationQueue बनाम ??? आईफोन

[NSThread detachNewThreadSelector:@selector(cacheImage:) toTarget:self withObject:image]; 
वैकल्पिक रूप से

:

[self performSelectorInBackground:@selector(cacheImage:) withObject:image]; 

वैकल्पिक रूप से, मैं एक NSOperationQueue

NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(cacheImage:) object:image]; 
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init]; 
[opQueue addOperation:invOperation]; 

उपयोग कर सकते हैं वहाँ NSThread से दूर स्विच करने के लिए किसी भी कारण है? जीसीडी एक चौथा विकल्प है जब इसे आईफोन के लिए जारी किया जाता है, लेकिन जब तक कि कोई महत्वपूर्ण प्रदर्शन लाभ न हो, तो मैं अधिकतर प्लेटफॉर्म में काम करने वाली विधियों के साथ रहना चाहता हूं।


@ जॉन-एरिक की सलाह के आधार पर, मैं एक NSOperationQueue/NSOperation उपवर्ग समाधान के साथ चला गया। ये अच्छी तरह काम करता है। NSOperation कक्षा पर्याप्त लचीला है कि आप इसे अपनी आवश्यकताओं के आधार पर, इनवोकेशन, ब्लॉक या कस्टम सबक्लास के साथ उपयोग कर सकते हैं। कोई फर्क नहीं पड़ता कि आप अपना NSOperation कैसे बनाते हैं, जब आप इसे चलाने के लिए तैयार होते हैं तो आप इसे केवल एक ऑपरेशन कतार में फेंक सकते हैं। संचालन को आपके द्वारा कतार में रखी गई वस्तुओं के रूप में काम करने के लिए डिज़ाइन किया गया है या यदि आप चाहें तो उन्हें स्टैंडअलोन एसिंक्रोनस विधियों के रूप में चला सकते हैं। चूंकि आप आसानी से अपने कस्टम ऑपरेशन विधियों को आसानी से चला सकते हैं, परीक्षण परीक्षण आसान है।

मैंने इस सवाल को कुछ हद तक प्रोजेक्ट्स में इस्तेमाल किया है क्योंकि मैंने इस सवाल से पूछा था और मैं अपने कोड और मेरे परीक्षणों को साफ, संगठित और खुशी से असीमित रूप से रखने के तरीके से खुश नहीं हो सकता था।

एक ++++++++++ उपवर्ग फिर

+0

आप उनमें से प्रत्येक को प्रोफ़ाइल कर सकते हैं। यह पता लगाने का एक तरीका होगा। –

+0

प्रदर्शन गलत शब्द था, मुझे संदेह है कि वे सब नीचे समान हैं। मैं किसी ऐसे व्यक्ति की तलाश में हूं जिसने मुझे पसंदीदा तरीके से कुछ सलाह देने के लिए इन तरीकों में से दो या अधिक तरीकों का अनुभव किया है और यह बेहतर क्यों है। – kubi

उत्तर

32

सामान्य रूप से आपको NSOperationQueue के साथ बेहतर लाभ मिलेगा।

तीन विशिष्ट कारणों:

  • आप एक बार में कई मदों की कैशिंग आरंभ करने के लिए कर सकते हैं। NSOperationQueue शेष परिचालनों को कतार में कोर के रूप में केवल उतने ही धागे बनाने के लिए पर्याप्त स्मार्ट है। NSThread के साथ, 100 छवियों को कैश करने के लिए 100 थ्रेड बनाते हैं शायद अधिक से अधिक और कुछ हद तक अक्षम हैं।
  • आप cacheImage ऑपरेशन को रद्द करना चाहते हैं। NSOperationQueue के साथ रद्दीकरण को कार्यान्वित करना आसान है; अधिकांश काम आपके लिए पहले से ही किया जा चुका है।
  • NSOperationQueue अब या भविष्य में एक बेहतर कार्यान्वयन (जैसे ग्रांड सेंट्रल डिस्पैच) पर स्विच करने के लिए स्वतंत्र है। NSThread हमेशा एक ऑपरेटिंग सिस्टम थ्रेड होने की अधिक संभावना है।

बोनस:

  • NSOperationQueue कुछ अन्य अच्छा निर्माणों में निर्मित किया गया है, इस तरह के आपरेशन प्राथमिकताओं और निर्भरता का सम्मान का एक परिष्कृत तरीके के रूप में।
+0

मान लीजिए कि आपको NSOperationQueue प्रदान किए जाने वाले एक्स्ट्रा की आवश्यकता नहीं है, क्यों 100 एनएसटीएचडी अक्षम हैं? या आप मान रहे हैं कि 100 धागे बनाने की जरूरत है, तो कुछ NSOperationQueue उपहारों की आवश्यकता होनी चाहिए? – Tony

+4

@ टोनी: धागा बनाना बहुत महंगा है। http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html – kubi

5

मैं NSOperationQueue का प्रयोग करेंगे होगा। ओएस 3.2 के तहत, NSOperationQueue हुड के नीचे धागे का उपयोग करता है, इसलिए दो विधियों को समान प्रदर्शन करना चाहिए। हालांकि, मैक ओएस 10.6, NSOperationQueue के तहत हुड के तहत जीसीडी का उपयोग करता है और इसलिए अलग-अलग धागे के ऊपरी हिस्से का लाभ नहीं होता है। मैंने ओएस 4 के लिए दस्तावेज़ों को नहीं देखा है, लेकिन मुझे संदेह होगा कि यह कुछ ऐसा ही करता है - किसी भी मामले में, NSOperationQueue आईफोन के लिए जीसीडी के प्रदर्शन लाभ उपलब्ध होने पर कार्यान्वयन स्वैप कर सकता है।

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