2012-04-03 9 views
10

मुझे निर्देशिका और उनकी सामग्री डाउनलोड करने के लिए मेरे आवेदन में आवश्यकता है। तो मैंने NSOperationQueue को लागू करने का निर्णय लिया और मैंने NSURLRequest इत्यादि को लागू करने के लिए NSOperation को उप-वर्गीकृत किया ...आईओएस - कैसे पता चलेगा जब NSOperationQueue कुछ परिचालनों को संसाधित करता है?

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

अब मुझे यह इंतजार करना होगा कि यूआई को अपडेट करने के लिए सभी निर्देशिकाओं की सभी फाइलें डाउनलोड की गई हैं।

मैंने ऑपरेशन के लिए पहले से ही महत्वपूर्ण मूल्य लागू किया है NSOperationQueue की गणना और NSOperation की समाप्ति है लेकिन मुझे नहीं पता कि निर्देशिका में सभी फाइलें कब होती हैं!

क्या आपके पास कोई विचार है?

धन्यवाद एक बहुत

+0

में मदद करता है यह अधिक dispatch_group_async उपयोग करने के लिए सुविधाजनक है। http://stackoverflow.com/questions/9632235/how-do-i-know-all-my-tasks-in-grand-central: इस लिंक [कड़ी] [1] [1] देखें -डिस्पाच-समाप्त – Igor

उत्तर

47

जोड़ें NSOperation जो निर्भरता के रूप में एक निर्देशिका के लिए अन्य सभी NSOperations है "हो गया"।

कुछ इस तरह:

NSInvocationOperation *doneOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(done:) object:nil]; 

NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething:) object:nil]; 
[queue addOperation:op1]; 
[doneOp addDependency:op1]; 

NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething:) object:nil]; 
[queue addOperation:op2]; 
[doneOp addDependency:op2]; 

NSInvocationOperation *op3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething:) object:nil]; 
[queue addOperation:op3]; 
[doneOp addDependency:op3]; 

[queue addOperation:doneOp]; 

doneOp के बाद ही op1, op2 और op3 क्रियान्वित समाप्त कर दिया है चलेंगे।

+0

मैं यह उल्लेख करना भूल गया कि मेरे परिचालन समवर्ती हैं। क्या आपका उदाहरण अभी भी ठीक है? – Dabrut

+0

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

+0

आप के लिए कुडोस। यही वही है जो मैं ढूंढ रहा था! – Dabrut

0

एक दृष्टिकोण इस तरह के loadedCount (शुरू 0) और fileCount के रूप में एक गुणों के साथ निर्देशिका वर्ग के कुछ प्रकार बनाने के लिए किया जाएगा (हालांकि कई फाइलों को प्रारंभ निर्देशिका में कर रहे हैं) और एक मानचित्रण शब्दकोश बनाने कतार में ऑपरेशन जोड़ने से पहले उपयुक्त एनएसओपरेशन प्रत्येक निर्देशिका में। समाप्त होने के लिए अपने कॉलबैक के अंदर, आप निर्देशिका के बाहर दिए गए एनएसओपरेशन के लिए निर्देशिका ऑब्जेक्ट खींच सकते हैं और निर्देशिका में वृद्धि कर सकते हैं .लोडेड 1 द्वारा गणना करें। यदि आपकी निर्देशिका .loadedCount == directory.fileCount, UI को अपडेट ट्रिगर करें।

+0

यह मेरा पहला विचार था। लेकिन मैं सोच रहा था कि क्या ऐसा करने का सही तरीका था या अगर ऐसा करने का बेहतर तरीका था। – Dabrut

0

आप एक बार में सभी अनुरोधों को रद्द करने से बचने के लिए अपने कोड को दोबारा कर सकते हैं। एक समय में केवल एक निर्देशिका के लिए अनुरोध करें। जब operationCount शून्य तक पहुंच जाता है, तो आप सुनिश्चित हो सकते हैं कि सभी अनुरोध या तो पूर्ण या विफल हो गए हैं, यूआई अपडेट करें और अगली निर्देशिका के अनुरोधों को एनक्यू करें। निर्देशिका की सरणी खाली होने तक आगे बढ़ें।

लाभ हैं:

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