7

के अंदर मौजूद है, मुझे NSoperationQue से संबंधित समस्या का सामना करना पड़ रहा है। में मेरी कोड में:कॉलिंग - (शून्य) रद्द करें NSoperationQueue NSOperation की रद्द की गई संपत्ति को सेट नहीं कर रहा है जो कि कतार

-(void) viewDidLoad 
{ 
    //Initialisation of queue and operation. 
    //adding operation to queue 
    [self.operationQueue addOperation:op]; 

} 

-(void) viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [self.operationQueue cancelAllOperations]; 
} 

तो मेरी NSOperation मुख्य कार्य के निष्पादन के दौरान जब मैं isCancelled संपत्ति के लिए जाँच कर रहा हूँ यह हमेशा नहीं देता है। NSOperationQueue पर cancellAllOperation कॉल करने के बाद वास्तव में। उदाहरण के लिए।

-(void)main 
{ 
    if(self.isCancelled) 
    { 
    // Never executing this block :-(
    } 

} 

अधिक जानकारी के लिए मैं अपने NSOperation.And में कुछ नेटवर्क कॉल कर रहा हूँ जब मैं तो cancelAllOperation द्वारा अन्य दृश्य में स्विच करने के लिए बुलाया गया है। और जब मेरे एनएसओपरेशन में नेटवर्क प्रतिक्रिया वापस आई, तो मैं जांच रहा हूं कि (Self.isCancelled) और अब मैं एक और दृश्य में हूं (मतलब है कि रद्द किया गया है YES सेट करना चाहिए)। लेकिन यह जांच हमेशा विफल रहता है।

+0

क्या आप सुनिश्चित हैं कि आपके ऑपरेशन को रद्द करने के समय से पहले ही ऑपरेशन शुरू नहीं हुआ हैऑपरऑपरेशंस? आपको अपने ऑपरेशन के निष्पादन में सेट की गई रद्द की गई संपत्ति की जांच करनी होगी। –

+0

मैं लगातार अपने ऑपरेशन मुख्य विधि में रद्द की गई संपत्ति की जांच कर रहा हूं। मैं ब्रेकपॉइंट्स के माध्यम से डीबग करता हूं और पाया कि रद्द करने के बाद ऑलऑपरेशन विधि जब कॉल इस चेकपॉइंट पर वापस आती है, तो (self.isCancelled) हमेशा इसकी वापसी नहीं करता है। – kidsid49

+0

क्या आप अपने एनएसओपरेशन पर 'रद्द करें' विधि को ओवरराइड कर रहे हैं? यदि हां, तो क्या आप इसे पोस्ट कर सकते हैं? यदि नहीं, तो क्या आप ओवरराइड कर सकते हैं, (सुपर कॉल करें) और इसे देखने के लिए लॉग या ब्रेकपॉइंट डालें? –

उत्तर

1

viewDidLoad में दृश्य लोड करने के बाद ही आपका ऑपरेशन कतार में जोड़ा गया है, और कतार फिर ऑपरेशन शुरू करने की ज़िम्मेदारी ले लेगी।

चूंकि दृश्य गायब हो जाता है जब आप अपना ऑपरेशन रद्द कर देते हैं (viewWillDisappear), ऑपरेशन इस समय समाप्त होने की संभावना है। दूसरे शब्दों में, समाप्त होने के बाद आपका ऑपरेशन रद्द कर दिया गया है। ऑपरेशन सक्रिय रूप से काम कर रहा है या नहीं, यह जानने के लिए आप isExecuting संपत्ति देख सकते हैं।

+0

मैं लगातार अपने ऑपरेशन मुख्य विधि में रद्द की गई संपत्ति की जांच कर रहा हूं। मैं ब्रेकपॉइंट्स के माध्यम से डीबग करता हूं और पाया कि रद्द करने के बाद ऑलऑपरेशन विधि जब कॉल इस चेकपॉइंट पर वापस आती है, तो (self.isCancelled) हमेशा इसकी वापसी नहीं करता है। कॉल केवल इस चेकपॉइंट पर आएगा जब मेरा ऑपरेशन निष्पादित हो रहा है। – kidsid49

1

आपका ऑपरेशन शायद अब नहीं चल रहा है, और इसलिए रद्द नहीं किया जाएगा। (एक बार आपका ऑपरेशन समाप्त हो जाने के बाद, ऑपरेशन कतार अब इसका ट्रैक नहीं रखेगी, इसलिए cancelAllOperations पर कॉल करने से कुछ भी नहीं होगा।)

यदि नेटवर्क प्रतिक्रिया आप प्रतीक्षा कर रहे हैं तो कॉल को अवरुद्ध करने के बजाय कॉलबैक कॉल कर रहा है main पर, आपका ऑपरेशन पहले ही समाप्त हो जाएगा (जब मुख्य रिटर्न)। आप इसे "समवर्ती" ऑपरेशन का उपयोग कर ठीक कर सकते हैं (एनएसओपरेशन डॉक्स देखें; आप मुख्य रिटर्न के दौरान स्वचालित रूप से किए जाने के बजाय, सिंक्रोनस नेटवर्किंग कॉल का उपयोग करके, जब आप कर सकते हैं, तो इंगित कर सकते हैं (इसलिए मुख्य तब तक वापस नहीं आता है आप वास्तव में कर रहे हैं)।

+0

मुझे आपका अंक मिलता है। जब मेरी प्रतिक्रिया आती है तो मैं जांच कर रहा हूं। यदि यह हाँ है तो मैं वापस लौट रहा हूं अन्यथा मैं अपने टैबलेट व्यू को पुनः लोड कर रहा हूं, ताजा सामग्री के साथ प्रतिक्रिया से है।अब मैं क्या करना चाहता हूं कि अगर मैं उस दृश्य में नहीं हूं तो प्रतिक्रिया वापस आनी चाहिए, इसे जांचना चाहिए संपत्ति को रद्द करना चाहिए और अगर मैं वर्तमान में उस दृश्य में नहीं हूं तो मुझे अपना टैबलेट व्यू लोड नहीं करना चाहिए। तो क्या आप मुझे थोड़ा संकेत दे सकते हैं कि इस स्थिति को कैसे संभाला जा सकता है? – kidsid49

+0

ठीक है, आप एक सिंक्रोनस नेटवर्किंग विधि का उपयोग कर सकते हैं, जैसा कि मैंने सुझाव दिया है, और उसके बाद जांच की गई है (क्योंकि आपका ऑपरेशन अभी भी निष्पादित होगा)। वैकल्पिक रूप से, आप एएफनेटवर्किंग जैसी तीसरी आंशिक लाइब्रेरी का उपयोग कर सकते हैं जिसमें पहले से निर्मित नेटवर्क गतिविधि के लिए रद्द करने योग्य एनएसओपरेशंस हैं। –

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