2009-04-18 13 views
9

मेरे पास एक एनएसआईएनवोकेशनऑपरेशन है जो पृष्ठभूमि में एनएसएक्सएमएल दस्तावेज़ों की श्रृंखला को मेरे यूआई उत्तरदायी में डाउनलोड और पार्स करेगा।एनएसआईएनवोकेशन ऑपरेशन को कैसे रोकें?

आमंत्रण ऑपरेशन को रोकने पर मेरा प्रयास मेरे NSOperationQueue के cancellAllOperations को कॉल करना है। लेकिन ऐसा लगता है कि यह आमंत्रण के निष्पादन को रोक नहीं देगा।

इस समस्या के बारे में कोई विचार कैसे होगा?

उत्तर

3

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

अपने ऑपरेशन की मुख्य विधि में, आपको isCancelled की जांच करनी चाहिए और वास्तव में रद्द होने पर उस स्थिति को संभालना चाहिए।

अधिक जानकारी के लिए, थ्रेडिंग प्रोग्रामिंग मार्गदर्शिका में Creating and Managing Operation Objects देखें।

+0

लेकिन अन्य उत्तरों को देखें, ऐसा लगता है कि आप ऐसा नहीं कर सकते हैं (कम से कम 'isCancelled' की जांच करने के मानक तरीके में) 'NSInvocationOperation' का उपयोग करते समय। – jrdioko

5

उपरोक्त पोस्ट बहुत अच्छा है, लेकिन अधिक सीधे मूल प्रश्न का उत्तर देने के लिए: ऐसा लगता है कि आप एनएसआईएनवोकेशनऑपरेशन ऑब्जेक्ट को रोक नहीं सकते क्योंकि यह रद्दीकरण का समर्थन नहीं करता है। आपको इसे उपclass करना होगा।

11

अद्यतन: उपकरण जब मैं ऐसा करता हूं तो लीक-ए-भरपूर दिखाता है। सावधानी के साथ आगे बढ़ें! मैं इसे यहां रख रहा हूं अगर मैं वास्तव में कुछ पर हूं और कोई और यह पता लगा सकता है कि रिसाव बाधा को कैसे प्राप्त किया जाए।

के लिए NSInvocationOperation के initWithTarget वस्तु के रूप में संचालन सेट: चयनकर्ता: वस्तु: विधि

यहाँ एक मुड़ विचार है, जो मैं कर रहा हूँ फिर से कोशिश कर रहा है के रूप में मैं इस टाइप है।

NSInvocationOperation *operation = [NSInvocationOperation alloc]; 
operation = [operation initWithTarget:self selector:@selector(myOperation:) object:operation]; 
[queue addOperation:operation]; 
[operation release]; 

नोट हम अपने स्वयं के कॉल में alloc अलग तोड़ने के लिए है: आप पहले से ही यह मानकर है एक NSOperationQueue (हम इसे कतार फोन करता हूँ)। अन्यथा हम ऑब्जेक्ट से ऑपरेशन सेट नहीं कर सकते हैं!

फिर, अपने ऑपरेशन विधि के भीतर, ऑब्जेक्ट को वापस डालें और के लिए चेक छिड़काव 0 वांछित वांछित के रूप में है। उदाहरण के लिए: ... कॉल के बाद आप एक वस्तु में पारित हो जाएगा अब:

- (void)myOperation:(id)object { 
    NSInvocationOperation *operation = (NSInvocationOperation *)object; 
    if ([operation isCancelled]) return; 
    ... 
    } 

सुनिश्चित करें कि आपके चयनकर्ता एक कॉलन initWithTarget में वापस के साथ समाप्त होता बनाओ।

अब तक तो अच्छा। अब अगर मैं रद्द कर सकता हूं सभीऑपरेशन, मुझे पता चलेगा कि यह वास्तव में काम करता है या नहीं। :)

+0

लीक की वजह से कोशिश नहीं करेगा। लेकिन विचार बहुत अच्छा है! –

8

आपको यह जांचना होगा कि क्या एनएसआईएनवोकेशनऑपरेशन रद्द है या नहीं।जब आपरेशन चल रहा

NSInvocationOperation isCancelled पर्यवेक्षक के रूप में अपने वस्तु जोड़ें::

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:<targetObj> selector:@selector(<targetMethod>) object:nil]; 
[operation addObserver:<targetObj> forKeyPath:@"isCancelled" options:NSKeyValueObservingOptionNew context:nil]; 
[operQueue addOperation:operation]; 
[operation release]; 

फिर targetObj में लागू

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; 

देखने के लिए कि NSInvocationOperation में, आप कुंजी मान अवलोकन उपयोग कर सकते हैं ऐसा करने के लिए NSOperationQueue के cancellAllOperations द्वारा परिवर्तित किया जा रहा है के लिए। आप यहां एक निजी ध्वज सेट कर सकते हैं और targetMethod इसे जांच सकते हैं और यदि आवश्यक हो तो रद्द कर सकते हैं।

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