2009-10-29 13 views
16

मैं NSOperationQueue का उपयोग करके एक क्रमबद्ध कार्य कतार सेट करना चाहता हूं लेकिन मैं दस्तावेज़ में चर्चा की गई शब्दावली से थोड़ा उलझन में हूं।NSOperationQueue और समवर्ती बनाम गैर-समवर्ती

एक NSOperation वस्तु के संदर्भ में, शर्तों समवर्ती और गैर समवर्ती पक्ष-साथ धागे के निष्पादन का उल्लेख जरूरी नहीं है। इसके बजाए, एक गैर-समवर्ती ऑपरेशन का उपयोग करने वाला वातावरण है जो के लिए प्रदान किया गया वातावरण है, जबकि एक समवर्ती ऑपरेशन अपने निष्पादन वातावरण को स्थापित करने के लिए ज़िम्मेदार है।

क्या यह सेटअप "खुद निष्पादन पर्यावरण 'के लिए क्या मतलब है?

मेरे NSOperation व्युत्पन्न कार्य क्रम में वे कतार में जोड़ा गया में क्रमानुसार पर अमल करने की जरूरत है।

तो मैंने सोचा कि यह संकेत मिलता है एक 'गैर-समवर्ती' ऑपरेशन इसलिए मैं उस काम के लिए 'मुख्य' लागू करता हूं जिसे पूरा करने की आवश्यकता होती है और 'isConcurrent' के लिए भी वापस नहीं आती है। इसके अतिरिक्त, NSOperationQueue की 'setMaxConcurrentOperationCount' को 1

पर सेट किया जाएगा। कारण मैं NSOperation dependenc स्थापित नहीं कर रहा हूँ y इन कार्यों के बीच है क्योंकि वे कतार में डाले गए आदेश को पूरा करने के क्रम को पूरा करना चाहिए।

क्या ये धारणाएं सही हैं?

उत्तर

23

NSOperationQueue खाते में निर्भरता लेने के दौरान, हमेशा एक साथ संचालन निष्पादित करता है।

एक "गैर-समवर्ती" ऑपरेशन को समवर्ती रूप से निष्पादित करने के लिए एक अलग थ्रेड की आवश्यकता होती है। NSOperationQueue इस धागे को प्रदान करने के लिए ज़िम्मेदार है। दूसरे शब्दों में, एक गैर-समवर्ती ऑपरेशन एक समवर्ती ऑपरेशन करने के लिए NSOperationQueue पर निर्भर करता है।

एक "समवर्ती" ऑपरेशन अपने आप पर समवर्ती है; इसके लिए धागा बनाने के लिए NSOperationQueue की आवश्यकता नहीं है। एक उदाहरण एक ऑपरेशन होगा जो एसिंक्रोनस फ़ाइल आईओ का उपयोग करता है।

यदि आप क्रमशः निष्पादित करने के लिए दो या अधिक ऑपरेशन चाहते हैं तो आपको निर्भरताओं का उपयोग करने की आवश्यकता है।

यदि आप मुख्य थ्रेड को अवरुद्ध करने के लिए एक ऑपरेशन चाहते हैं तो NSOperationQueue का उपयोग न करें; मुख्य थ्रेड पर दूसरे के बाद एक ही ऑपरेशन चलाएं।

मैन्युअल operationQueue setMaxConcurrentOperationCount:

+9

यदि आप अपने NSOperationQueue पर MaxConcurrentOperationCount सेट करते हैं तो आपको निर्भरताओं का उपयोग करने की आवश्यकता नहीं है। मेरे अनुभव में, यह कतार में जोड़े गए क्रम में संचालन को संसाधित करता है। हालांकि, आप केवल सुरक्षित होने के लिए निर्भरताओं को स्थापित कर सकते हैं। –

+10

दस्तावेज़ बताता है कि अधिकतम गणना को केवल 1 तक सेट करने से फीफो ऑर्डर की गारंटी नहीं मिलती है। NSOperationQueue ऑर्डर निर्धारित करने के लिए खाते में प्राथमिकताओं और कुछ अन्य चीजें भी लेता है। –

1

क्या आपको वास्तव में NSOperation उपclass करने की आवश्यकता है? क्यों न केवल NSInvocationOperation और इसकी addDependency: विधि का उपयोग क्यों करें?

this SO question में मेरा उत्तर देखें।

+0

पर समवर्ती आपरेशन के अधिकतम, उपयोग विधि सेट करने के लिए तो NSInvocationOperation जहां बनाने एक उपवर्ग overkill है हल्के कार्यों के लिए है .. लेकिन क्या एक "खुद निष्पादन वातावरण" का गठन? –

+0

दिलचस्प बात यह है कि यह शब्द दस्तावेज़ के नवीनतम संस्करण में नहीं है (नीचे लिंक देखें)। मेरा मानना ​​है कि शब्द किसी भी सेटअप को संदर्भित करता है जिसे आपको थ्रेड सृजन के संबंध में करने की आवश्यकता होती है। https://developer.apple।कॉम/आईफोन/लाइब्रेरी/प्रलेखन/कोको/संदर्भ/एनएसओपरेशन_क्लास/संदर्भ/संदर्भ.html – nall

+0

पुराने दस्तावेज़ीकरण से यह वाक्यांश प्रासंगिक प्रतीत होता है: आपकी प्रारंभ विधि में, आपको निष्पादन के लिए ऑपरेशन तैयार करना होगा, जिसमें आपके लिए रनटाइम वातावरण तैयार करना शामिल है ऑपरेशन। (उदाहरण के लिए, यदि आप स्वयं धागा बनाना चाहते हैं, तो आप इसे यहां करेंगे।) एक बार आपके रनटाइम पर्यावरण की स्थापना हो जाने के बाद, आप किसी भी विधियों या कार्यों को कॉल कर सकते हैं जिन्हें आप बाद में अपना ऑपरेशन शुरू करना चाहते हैं। – nall

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