2012-10-19 13 views
5

मैं वर्तमान में जीसीडी का उपयोग कर रहा हूं। हालांकि, मैंने सुना है कि NSOperation वास्तव में एक उच्च स्तर का कार्यक्रम है। हालांकि यह कहीं अधिक जटिल है।किसके लिए उपयोग करना आसान है? जीसीडी या एनएसओपरेशन?

+(void)doForeGround:(void (^)())block 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     block(); 
    }); 
} 

+(void)doBackground:(void (^)())block 
{ 

    //DISPATCH_QUEUE_PRIORITY_HIGH 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0), ^{ 
    //dispatch_async(dispatch_get_global_queue(-2,0), ^{ 
     block(); 
    }); 
} 

-(void)doBackGround:(void (^)())block onComletion:(void (^)())onCompletion 
{ 
    [BGHPTools doBackground:^{ 
     block(); 
     [BGHPTools doForeGround:^{ 
      onCompletion(); 
     }]; 
    }]; 
} 

विल NSOperation साथ यह कर आसान हो:

GCD में, यह सहायक समारोह मैं बनाया का उपयोग कर रहा है पृष्ठभूमि में कुछ करने के लिए बस?

क्या मुझे कुछ याद आ रही है? एनएस ऑपरेशन में मैं वही काम कैसे करूं?

उत्तर

6

के रूप में आप GCD साथ क्या कर रहे आप NSOperation के साथ इसी तरह काम कर सकें। मुख्य अंतर यह है कि NSOperation अतिरिक्त कार्यक्षमता प्रदान करता है।

उदाहरण के लिए:

  • NSOperation एक -cancel विधि है। डिस्पैच कतारों में रद्दीकरण की कोई अवधारणा नहीं है; एक कतार पर लगाए गए सभी ब्लॉक पूरा होने के लिए दौड़ेंगे।
  • NSOperationQueue में maximumConcurrentOperationCount संपत्ति है, जिसका आप उपयोग कर सकते हैं (उदाहरण के लिए) केवल एक समय में 3 संचालन चलाने की अनुमति देता है। डिस्पैच कतारों में ऐसी कोई अवधारणा नहीं है; वे या तो सीरियल हैं, जो एक समय में केवल 1 ब्लॉक की अनुमति देते हैं, या समवर्ती, libdispatch को सीपीयू उपयोग और उपलब्धता के आधार पर सलाह दी जाती है।
  • एक NSOperation अन्य NSOperation एस पर निर्भरता हो सकता है, जिससे आप किसी विशेष ऑपरेशन को निष्पादित करने की अनुमति दे सकते हैं जब तक कि इसकी सभी निर्भरताएं चलती नहीं हैं। निर्भर संचालन इंतजार कर रहे हैं, जबकि अन्य परिचालनों को कतार में "आगे बढ़ना" की अनुमति दी जाएगी। डिस्पैच कतारों को सख्ती से फीफो ऑर्डर में हमेशा हटा दिया जाता है। (आप कुछ हद तक dispatch_group एपीआई का उपयोग कर निर्भरता की नकल कर सकते हैं, लेकिन वास्तव में इस समस्या का एक अलग तरह से लक्षित है।)

अब, अगर आप उन सुविधाओं के किसी भी उपयोग नहीं कर रहे, GCD बस ठीक काम करता है। जीसीडी, प्रति से उपयोग के साथ गलत कुछ भी नहीं है। यह सिर्फ इतना है कि NSOperation कुछ अतिरिक्त अच्छी सुविधाओं के लिए एक सुविधाजनक रैपर प्रदान करता है।

का तरीका यहां बताया NSOperationQueue का उपयोग करके उपरोक्त अपने उदाहरण पुनर्लेखन करेंगे:

+(void)doForeground:(void (^)())block 
{ 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
     NSLog(@"I'm running on the main thread!"); 
     block(); 
    }]; 
} 

+(void)doBackground:(void (^)())block 
{ 
    // Note; rather than allocating a new NSOperationQueue every time, you could 
    // allocate the queue once and just refer to that queue. For simplicity, I'll 
    // skip that here. 
    [[NSOperationQueue new] addOperationWithBlock:^{ 
     NSLog(@"I'm running asynchronously on whatever thread NSOperationQueue wants!"); 
     block(); 
    }]; 
} 

-(void)doBackground:(void (^)())block onCompletion:(void (^)())onCompletion 
{ 
    [[NSOperationQueue new] addOperationWithBlock:^{ 
     block(); 
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
      onCompletion(); 
     }]; 
    }]; 
} 
+0

और मुझे लगता है कि NSOperation भी अपने स्वयं के नेस्टेड ऑटोरेलीज़ स्टैक बनाते हैं? –

+0

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html नए नामक विधि का वर्णन नहीं करता है। आह यह आवंटन के लिए शॉर्टकट होना चाहिए] init] –

+0

'+ new' को' NSObject' से विरासत में मिला है, बस आवंटन और init की तरह। और हाँ, प्रत्येक ऑपरेशन का ब्लॉक एक ऑटोरेलीज पूल में रहेंगे। –

4

अपनी तुलना के लिए कोई कार्रवाई कतार उदाहरण:

- (void)viewDidLoad 
{ 
    // ... 

    self.queue = [[NSOperationQueue alloc] init]; 

    // ... 
} 

- (void)job 
{ 
    // background activities ... 
} 

- (void)startJob 
{ 
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self 
                    selector:@selector(job) 
                    object:nil]; 
    [self.queue addOperation:op]; 
} 
+1

मैं वैसे भी ब्लॉक :) पाठ्यक्रम +1 के –

+1

का उपयोग कर की तरह। –

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