2012-08-16 24 views
14

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

उत्तर

10

इस देखें: Link

और से यहां apple docs:

निलंबित और फिर से शुरू करना कतार आप आपरेशन के निष्पादन के लिए एक अस्थायी पड़ाव जारी करने के लिए चाहते हैं, आप इसी आपरेशन कतार निलंबित कर सकते हैं setSuspended: विधि का उपयोग कर।

एक कतार को निलंबित करने से पहले से ही अपने कार्यों के बीच में रुकने के लिए संचालन निष्पादित नहीं होता है। यह केवल नए संचालन को निष्पादन के लिए निर्धारित होने से रोकता है। किसी भी चल रहे काम को रोकने के लिए उपयोगकर्ता अनुरोध के जवाब में आप एक कतार निलंबित कर सकते हैं, क्योंकि उम्मीद है कि उपयोगकर्ता अंततः उस काम को फिर से शुरू करना चाहता है।

+0

धन्यवाद! मैंने आपके लिंक से लागू करने की कोशिश की। मैंने NSOperation के अंदर 'isPaused' नामक एक नया चर जोड़ा और जब भी मुझे ऑपरेशन को रोकना होगा, तो मैं इसका मान YES पर सेट कर दूंगा। NSOperation के अंदर मैं नियमित रूप से 'isPaused' के मान की जांच करूंगा। जब भी मैं इसे 'हां' में पाता हूं तो मैं लूप से बाहर हो जाऊंगा। लेकिन मुझे यहां गंभीर समस्या है। मैं मुख्य थ्रेड से 'isPaused' के मान को सेट करने का प्रयास कर रहा हूं। इससे कुछ दौड़ की स्थिति हो सकती है। क्या दौड़ की स्थिति से छुटकारा पाने का कोई तरीका है? क्या एक ही धागे (मुख्य धागे की बजाय) में विधियों को रोकने के लिए (रोकें और फिर से शुरू करें) को कॉल करने का कोई तरीका है? – Advaith

+1

@Advaith: यदि दोनों थ्रेड्स 'isPaused' से पढ़ने या लिखने से पहले एक म्यूटेक्स को लॉक करते हैं, तो आपको दौड़ के बारे में चिंता करने की आवश्यकता नहीं होगी। –

3

मैं इस कोशिश की नहीं है, लेकिन मैं शायद यहाँ शुरू होगा:

  • अपने NSOperation उपवर्ग
  • करने के लिए एक isPaused फ्लैग जोड़ने आपरेशन के डेटा के लिए एक प्रतिलिपि/स्थानांतरित तरीका लागू
  • अगर रोका गया, (-main में इस बदलाव के लिए देखें)
  • राज्य को रोके हुए ऑपरेशन से नए ऑपरेशन में स्थानांतरित करने वाला एक नया ऑपरेशन
  • , कतार में आपरेशन आदेश को पुन: व्यवस्थित करने के लिए प्राथमिकता समायोजित अगर आप
  • क्लोन कतार में में -main

ध्यान दें कि यह बस इसे निलंबित कर देगा -main से

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

    अब, यदि आप देख रहे हैं या विशेष समापन कर रहे हैं, तो आपको कुछ अन्य समस्याएं होंगी। सरल मामलों के लिए, ऐसा लगता है कि यह दृष्टिकोण ठीक काम करेगा।

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

    • कोई संबंधित समस्या नहीं^_^