2011-03-07 13 views
6

डॉक्स से:आईओएस - एनएसओपरेशन क्यूयू में एनएसओपरेशन क्या है या नहीं?

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

तो मैं अगर मैं सुरक्षित रूप से एक कतार में एक NSOperation जोड़ सकते हैं, इसकी जांच करते हैं?

मुझे पता है कि एकमात्र तरीका ऑपरेशन जोड़ रहा है और फिर अपवाद को पकड़ने का प्रयास करें यदि ऑपरेशन पहले से ही कतार में है या पहले निष्पादित है।

उत्तर

14

NSOperationQueue वस्तुओं में operations नामक एक संपत्ति है।

यदि आपके पास कतार का संदर्भ है तो यह जांचना आसान है।

आप देख सकते हैं आपरेशन के NSArray इस तरह से अपनी NSOperation शामिल हैं:

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

NSOperation *operation = [[NSOperation alloc] init]; 

[queue addOperation:operation]; 

if([queue operations] containsObject:operation]) 
    NSLog(@"Operation is in the queue"); 
else 
    NSLog(@"Operation is not in the queue"); 

या आप सभी वस्तुओं पर पुनरावृति कर सकते हैं:

for(NSOperation *op in [queue operations]) 
    if (op==operation) { 
     NSLog(@"Operation is in the queue"); 
    } 
    else { 
     NSLog(@"Operation is not in the queue"); 
    } 

मुझे बताओ अगर यह आप क्या देख रहे है के लिये।

वैकल्पिक रूप से, NSOperation वस्तुओं में कई गुण हैं जो आपको अपनी स्थिति की जांच करने की अनुमति देते हैं; जैसे: isExecuting, isFinished, isCancelled, आदि ...

+0

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

+1

@ xlc0212: एक और समाधान जो मैं सोच सकता हूं वह एनएसओपरेशन को उप-वर्ग करना है, जिसे वास्तव में ऐप्पल द्वारा प्रोत्साहित किया जाता है; और एक बूलियन संपत्ति "isInQueue" जोड़ें जो आपको कतार में जोड़ते समय YES पर फ़्लैग किया जाता है। इस तरह, आपको कतार में संचालन जोड़ने से पहले इस संपत्ति को जांचना होगा। – Zebs

+0

मुझे ऑपरेशन को कब ध्वजांकित करना चाहिए? मुझे इसे कतार में जोड़ने से पहले इसे मैन्युअल रूप से सेट करना चाहिए या मुझे कुछ विधि को ओवरराइड करना चाहिए जो कतार द्वारा बुलाया जाएगा और फिर ध्वज सेट करें –

4

आप एक NSOperationQueue के लिए एक NSOperation वस्तु जोड़ते हैं, NSOperationQueue वस्तु है, तो NSOperation के निर्माता इसे जारी कर सकते हैं बरकरार रखती है । आप इस रणनीति के साथ रहती है, तो NSOperationQueues हमेशा अपने NSOperation वस्तुओं की केवल मालिक हो जाएगा, तो आप किसी भी अन्य कतार में एक NSOperation वस्तु को जोड़ने के लिए सक्षम नहीं होगा।

आप अब भी व्यक्तिगत NSOperation वस्तुओं के बाद वे कतार में जोड़ दिए गए संदर्भ लेना चाहते हैं, तो आप ऐसा NSOperationQueue के - (NSArray *)operations विधि का उपयोग कर सकते हैं।