2012-09-30 27 views
15

xCode 4.4.1 ओएसएक्स 10.8.2, ऐसा लगता है [ऑपरेशन रद्दअधिकऑपरेशन]; अपने ब्लॉक के अंदर[NSOperation CancelAllOperations]; ऑपरेशन को रोक नहीं है

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    NSOperationQueue *operation = [[NSOperationQueue alloc] init]; 
    [operation setMaxConcurrentOperationCount: 1]; 
    [operation addOperationWithBlock: ^{ 
     for (unsigned i=0; i < 10000000; i++) { 
      printf("%i\n",i); 
      } 
    }]; 
    sleep(1); 
    if ([operation operationCount] > 0) { 
     [operation cancelAllOperations]; 
    } 
} 

परिणाम 9999999

उत्तर

26

काम नहीं कर रहा है, विशेष रूप पाश अंदर, संचालन पर -isCancelled कहते हैं। यदि यह सच है, तो वापस आओ।

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
[operationQueue setMaxConcurrentOperationCount: 1]; 

NSBlockOperation *operation = [[NSBlockOperation alloc] init]; 
__weak NSBlockOperation *weakOperation = operation; 
[operation addExecutionBlock:^{ 
    for (unsigned i=0; i < 10000000; i++) { 
     if ([weakOperation isCancelled]) return; 
     printf("%i\n",i); 
    } 
}]; 
[operationQueue addOperation:operation]; 

sleep(1); 

if ([operationQueue operationCount] > 0) { 
    [operationQueue cancelAllOperations]; 
} 

एक कतार न सिर्फ मनमाने ढंग से आपरेशन को फांसी बंद कर सकते हैं - क्या कुछ साझा संसाधन आपरेशन कि कभी नहीं साफ हो गया द्वारा इस्तेमाल किए जा रहे हैं? इसे रद्द करने के लिए जाना जाने पर ऑपरेशन को व्यवस्थित रूप से समाप्त करना आपकी ज़िम्मेदारी है। Apple's docs से:

कोई कार्रवाई वस्तु isCancelled समय-समय पर बुला और खुद को रोक विधि लौटाता है यदि हाँ लिए जिम्मेदार है।

+0

तो कोई भी तरीका खत्म होने तक ऑपरेशन बंद नहीं करता है? – Awesome

+0

वहाँ है - कोड के भीतर, आप चेक किया गया है चेक किया गया है। यदि यह सच है, तो आप निष्पादन करना बंद कर देते हैं। ऑपरेशन खुद को रोकता है, कतार बस इसे रद्द करने के लिए कहती है। क्या इसका कोई मतलब है? –

+0

धन्यवाद आप :) मुझे यह नहीं मिला। – Awesome