2015-08-29 8 views
7

मेरे विचार में मेरे पास छवि दृश्य है, छवि दृश्य के लिए डेटा यूआरएल फॉर्म आता है, छवियां लगभग 1-3 एमबी हैं। यदि उपयोगकर्ता स्वाइप करता है तो मैं अगली छवि लोड करना चाहता हूं, धीरे-धीरे स्वाइप होने पर हर चीज ठीक काम करती है, लेकिन जब मैं तेजी से स्वाइप करता हूं तो मैं पिछले ऑपरेशन को रद्द करना चाहता हूं और नए यूआरएल से शुरू करना चाहता हूं।NsoperationQueue सभी ऑपरेशंस को रद्द नहीं किया जाता है जब तक कि यह ऑपरेशन समाप्त नहीं हो जाता

पूर्व के लिए। यदि उपयोगकर्ता दूसरी और तीसरी छवियों के लिए मध्यस्थ है, तो मैं 4 बार स्वाइप करता हूं, मैं उन्हें रद्द करना चाहता हूं और 4 वें छवि

पर डाउनलोड करना चाहता हूं लेकिन अब 4 वें छवि के स्थान पर मुझे पहली दूसरी छवि 3 मिल रही है और फिर 4 वें छवि प्रकट होती है।

यहाँ मेरी नमूना कोड

- (void)handleSwipeLeft:(UISwipeGestureRecognizer *)aSwipeGestureRecognizer { 


    [BackgroundOperation cancelAllOperations]; // To cancel previous one 


    [self performSelector:@selector(LoadImage) withObject:nil afterDelay:0.1]; 


} 

-(void)LoadImage 
{ 
    BackgroundOperation=[[NSOperationQueue alloc]init]; 


    imgvww.image=[UIImage imageNamed:@"loader.png"]; // Place holder till download finishes 


    [BackgroundOperation addOperationWithBlock:^ 
    { 
     UIImage *img=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[[self.ItemDetails objectAtIndex:0] objectForKey:@"ImageUrl"]]]]; // Getting data from URL 

     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 


      imgvww.image=img; //Adding to image view after completion 


     }]; 

    }]; 
} 

धन्यवाद है।

+0

कृपया अपने कोड ऐसी है कि अन्य लोगों को यह पढ़ सकते हैं फ़ॉर्मेट करने के लिए का प्रयास करते हैं। – jtbandes

+1

क्या आप किसी भी छवि को लोड होने की आवश्यकता होने पर 'पृष्ठभूमि ऑपरेशन' को पुनर्निर्मित कर रहे हैं ('पृष्ठभूमिऑपरेशन = [[NSOperationQueue alloc] init] के साथ;')? –

उत्तर

5

पर cancel कॉल करने के लिए की जरूरत है रद्द करने के लिए कर रहे हैं केवल अपने isCancelled को सही पर सेट करें।

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

आप check if your operation is cancelled within an operation block कर सकते हैं लेकिन मैं ब्लॉक का उपयोग करने के बजाय उपclassing की सिफारिश करेंगे।

+0

पर सेट करता है, मुझे स्पष्ट रूप से समझ में नहीं आया, ऐसा लगता है कि इसे जांचना है।लेकिन मैं उलझन में हूं कि यह मेरे कोड –

+0

में जांचने के लिए कहां है, मैं नेशनल का उपयोग नहीं कर रहा हूं, ऐसा लगता है कि nsoperation –

+0

'NSBlockOperation'' NSOperation' का उप-वर्ग है। इसे रद्द किया जा सकता है। लिंक को दोबारा जांचें और देखें कि यह कैसे (कमजोर) ब्लॉक ऑपरेशन कैप्चर करता है, इसलिए ब्लॉक के भीतर रद्द किया जा सकता है। यदि आप अभी भी यह सुनिश्चित नहीं कर रहे हैं कि यह कैसे करें, [इस विस्तृत लेख को देखें] (http://nghiatran.me/advanced-issues-the-right-way-to-load-content-in-backgrounds-thread-with -tableview /) जो ब्लॉक संचालन को रद्द करता है। –

4

cancelAllOperations को NSOperationQueue पर कॉल करने से प्रत्येक ऑपरेशन पर cancel कॉल किया जाएगा। यदि NSOperationcancel ओवरराइड नहीं करता है तो यह कभी रद्द नहीं होगा।

एक बार शुरू होने के बाद NSBlockOperation को रद्द करने की कोई अवधारणा नहीं है। ब्लॉक बस निष्पादित करता है और वह है।

यदि आप विशेष रद्द व्यवहार (जैसे अपनी छवि डाउनलोड को रद्द करना) निर्दिष्ट करना चाहते हैं तो आपको NSOperation उप-वर्ग करना होगा और cancel ओवरराइड करना होगा।

AFNetworking या SDWebImage

में इस के कई उदाहरण एक छवि डाउनलोड आप एक NSOperation में एक NSURLSesionDownloadTask लपेट और फिर cancel ओवरराइड एक ऑपरेशन रद्द कर रहा है NSURLSesionDownloadTask

+0

रद्द करने में सक्षम होने के लिए एनएसओपरेशन को उप-वर्ग करने की आवश्यकता नहीं है, इसे निष्पादित ब्लॉक – Yariv

+1

में करना संभव है जो ब्लॉक को रद्द कर देगा, लेकिन एक बार छवि डाउनलोड शुरू हो जाने के बाद डेटाविथकंट्सऑफ्लर – DBoyer

+0

'रद्द' का उपयोग करके इसे रोकना नहीं है वास्तव में सभी परिचालनों पर नहीं बुलाया जाता है, यह सिर्फ 'isCancelled' को YES – trapper

3

ऑपरेशन को रद्द करने से केवल isCancelled संपत्ति YES पर अपडेट हो जाएगी।
कार्रवाई को रद्द करने के लिए सक्षम होने के लिए, आपको निम्न करना चाहिए:

NSBlockOperation * op = [NSBlockOperation new]; 
__weak NSBlockOperation * weakOp = op; // Use a weak reference to avoid a retain cycle 
[op addExecutionBlock:^{ 
    // Put this code between whenever you want to allow an operation to cancel 
    // For example: Inside a loop, before a large calculation, before saving/updating data or UI, etc. 
    if (weakOp.isCancelled) return; 

    // Do something.. 
]; 
संबंधित मुद्दे

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