2012-04-09 9 views
7

मुझे यूआरएल कॉल (WMS टाइल्स लाने) की एक श्रृंखला करने की आवश्यकता है। मैं एक लिफो स्टैक का उपयोग करना चाहता हूं ताकि नवीनतम यूआरएल कॉल सबसे महत्वपूर्ण हो। मैं अब स्क्रीन पर टाइल प्रदर्शित करना चाहता हूं, एक पैन के बाद 5 सेकंड पहले स्क्रीन पर एक टाइल नहीं था।एक लिफो स्टैक के रूप में NSOperationQueue का उपयोग करें?

मैं एनएसएमयूटेबलएरे से अपना खुद का ढेर बना सकता हूं, लेकिन मुझे आश्चर्य है कि क्या एनएसओपेरेशन क्यूई का उपयोग लिफो स्टैक के रूप में किया जा सकता है?

उत्तर

3

दुख की बात है कि मुझे लगता है कि NSOperationQueue एस हैं, जैसा कि नाम से पता चलता है, केवल कतार के रूप में प्रयोग योग्य - ढेर के रूप में नहीं। कार्यों के मैन्युअल मार्शलिंग के पूरे समूह को करने से बचने के लिए, शायद सबसे आसान बात यह है कि आप अपनी कतारों का इलाज करें जैसे कि वे प्रतिलिपि बनाकर अपरिवर्तनीय और उत्परिवर्तित थे। जैसे

- (NSOperationQueue *)addOperation:(NSOperation *)operation toHeadOfQueue:(NSOperationQueue *)queue 
{ 
    // suspending a queue prevents it from issuing new operations; it doesn't 
    // pause any already ongoing operations. So we do this to prevent a race 
    // condition as we copy operations from the queue 
    queue.suspended = YES; 

    // create a new queue 
    NSOperationQueue *mutatedQueue = [[NSOperationQueue alloc] init]; 

    // add the new operation at the head 
    [mutatedQueue addOperation:operation]; 

    // copy in all the preexisting operations that haven't yet started 
    for(NSOperation *operation in [queue operations]) 
    { 
     if(!operation.isExecuting) 
      [mutatedQueue addOperation:operation]; 
    } 

    // the caller should now ensure the original queue is disposed of... 
} 

/* ... elsewhere ... */ 

NSOperationQueue *newQueue = [self addOperation:newOperation toHeadOfQueue:operationQueue]; 
[operationQueue release]; 
operationQueue = newQueue; 

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

+0

मैं belive इस काम करेगा, मैं सिर्फ एक NSMutableArray से अपने ही स्टैक बनाने के लिए तय कर लिया है। इनपुट के लिए धन्यवाद। – Padin215

+0

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

+0

मैं यूआरएल का ढेर बना रहा हूं कि मुझे डब्लूएमएस टाइल के लिए कॉल करने की ज़रूरत है। मैं जांचता हूं कि मेरे पास एक्स टाइल है, अगर यह कैश में नहीं है, तो मैंने यूआरएल को स्टैक पर रखा है। मेरे पास एक टाइमर है जो कभी भी 2 सेकंड तक आग लगता है जो अनुरोध बनाएगा और उसे निष्पादित करने के लिए जीडीसी कतार में रखेगा। – Padin215

4

आप -[NSOperation setQueuePriority:] का उपयोग कर ऑपरेशन कतार में संचालन की प्राथमिकता सेट कर सकते हैं। प्रत्येक बार जब आप कोई ऑपरेशन जोड़ते हैं तो आपको मौजूदा परिचालनों की प्राथमिकताओं को फिर से शुरू करना होगा, लेकिन आप जो कुछ खोज रहे हैं उसे प्राप्त कर सकते हैं। आप अनिवार्य रूप से सभी पुराने लोगों को हटा देंगे और नवीनतम सर्वोच्च प्राथमिकता देंगे।

+0

ऐप्पल के दस्तावेज़ से उद्धरण के लिए: आपको प्राथमिकता मानों का उपयोग केवल गैर-निर्भर संचालन की सापेक्ष प्राथमिकता को वर्गीकृत करने के लिए आवश्यक होना चाहिए। विभिन्न संचालन वस्तुओं के बीच निर्भरता प्रबंधन को लागू करने के लिए प्राथमिकता मानों का उपयोग नहीं किया जाना चाहिए। इसे यहां मिला: http://stackoverflow.com/questions/20297333/function-setqueuepriority-has- अलग-performance-on-ios-emulator-and-on-iphon। SetQueuePriority के साथ ऑर्डर सेट करने का प्रयास यादृच्छिक निष्पादन –

+0

@MichalGumny के साथ समाप्त हुआ, ऐप्पल दस्तावेज़ उद्धरण मेरे सुझाव को मान्य करता है। हम "गैर-निर्भर संचालन की सापेक्ष प्राथमिकता को वर्गीकृत करने" की कोशिश कर रहे हैं। हम निर्भरता प्रबंधन को लागू करने की कोशिश नहीं कर रहे हैं। कतार, अगर निलंबित नहीं है, जैसे ही इसे जोड़ा गया है या जब भी यह अधिकतम हो, एक ऑपरेशन शुरू कर सकता है। संगामिति। यदि आपके द्वारा उद्धृत अन्य प्रश्न ने कतार को निलंबित कर दिया था तो यह ठीक काम करेगा। कतार किसी भी समय संचालन शुरू कर सकती है और जाहिर है, संचालन की प्राथमिकता को बदलना पहले से ही नहीं हुआ है। लेकिन प्राथमिकता का सम्मान तब किया जाता है जब शुरू करने के लिए एक नया ऑपरेशन चुना जाता है। –

+0

प्रश्न एलआईएफओ आदेश के लिए था, ऐप्पल ने "सापेक्ष प्राथमिकता" लिखी जो मुझे लगता है कि हम 100% सुनिश्चित नहीं कर सकते हैं कि प्राथमिकता को संरक्षित किया जाएगा। मैंने इसे जांचने के लिए थोड़ा कोड भी लिखा और ऑर्डर बिल्कुल ठीक नहीं है: http://pastebin.com/ZM8G9s2P। ऑफसी मैं गलत हो सकता हूं, अगर यह मामला है तो कृपया मुझे सही करें –

1

मुझे यकीन नहीं है कि आप अभी भी समाधान ढूंढ रहे हैं, लेकिन मुझे एक ही समस्या है, मुझे थोड़ी देर के लिए परेशान कर रहा है, इसलिए मैं आगे बढ़ गया और यहां एक ऑपरेशन स्टैक लागू किया: https://github.com/cbrauchli/CBOperationStack। मैंने इसे कुछ सौ डाउनलोड ऑपरेशंस के साथ उपयोग किया है और यह अच्छी तरह से आयोजित हुआ है।

1

दुख की बात है, तो आप ऐसा नहीं कर सकते कुछ मुश्किल मुद्दों में चलने के बिना, क्योंकि:

महत्वपूर्ण आप हमेशा अपने संचालन चल रहे हैं या उन्हें एक ऑपरेशन कतार में जोड़ने से पहले निर्भरता कॉन्फ़िगर करना चाहिए। बाद में निर्भर निर्भरता किसी दिए गए ऑपरेशन ऑब्जेक्ट को चलने से नहीं रोक सकती है। (से: Concurrency Programming Guide: Configuring Interoperation Dependencies)

इस संबंधित सवाल पर एक नज़र डालें: AFURLConnectionOperation 'start' method gets called before it is ready and never gets called again afterwards

0

मिले ढेर के एक स्वच्छ कार्यान्वयन/LIFO NSOperationQueue की चोटी पर पेश करता है। इसका उपयोग ऐसी श्रेणी के रूप में किया जा सकता है जो NSOperationQueue या NSOperationQueue LIFO उप-वर्ग को बढ़ाता है।

https://github.com/nicklockwood/NSOperationStack

+0

अफसोस की बात है, आप कुछ मुश्किल मुद्दों को चलाने के बिना ऐसा नहीं कर सकते: http://stackoverflow.com/questions/14821406/afurlconnectionoperation-start-method-gets-called-before-it-is-ready-and-never –

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