iPhone ios अलग थ्रेड में चल रहा है


96

एक अलग थ्रेड पर कोड चलाने का सबसे अच्छा तरीका क्या है? क्या यह:

[NSThread detachNewThreadSelector: @selector(doStuff) toTarget:self withObject:NULL];

या:

    NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                        selector:@selector(doStuff:)
                                                                          object:nil;
[queue addOperation:operation];
[operation release];
[queue release];

मैं दूसरा तरीका कर रहा हूं, लेकिन वेस्ले कुकबुक मैं पहले पढ़ रहा था।

जवाबों:


244

मेरी राय में, सबसे अच्छा तरीका libdispatch उर्फ ​​ग्रैंड सेंट्रल डिस्पैच (GCD) है। यह आपको iOS 4 और अधिक तक सीमित करता है, लेकिन यह सिर्फ इतना सरल और उपयोग करने में आसान है। बैकग्राउंड थ्रेड पर कुछ प्रोसेसिंग करने और फिर मुख्य रन लूप में परिणाम के साथ कुछ करने का कोड अविश्वसनीय रूप से आसान और कॉम्पैक्ट है:

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Add code here to do background processing
    //
    //
    dispatch_async( dispatch_get_main_queue(), ^{
        // Add code here to update the UI/send notifications based on the
        // results of the background processing
    });
});

यदि आपने ऐसा पहले से नहीं किया है, तो WWD 2010 से libdispatch / GCD / block पर वीडियो देखें।


मुझे इसकी आवश्यकता 3.0 संगत है :(
माइक एस

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

इतना बाद में इसे फिर से जीवित करने के लिए क्षमा करें, लेकिन अगर मैं performSelector के साथ एक विधि कॉल स्पॉन करता हूं: withObject: afterDelay क्या मुझे अभी भी async विधि के अंदर एक NSAutoReleasePool का उपयोग करने की आवश्यकता है? अगर यह जादुई रूप से मुख्य ऑटो रिलीज़ पूल का उपयोग करता है तो परफॉर्मेस्टर: afterDelay निश्चित रूप से एक तेज विकल्प है।
माइक एस

नहीं, क्योंकि विधि मुख्य धागे पर चलाई जा रही है, जिसका अपना ऑटोरेलिज पूल है।
जैक्स

4
@ जो आप पहले से ही जानते हैं कि कुछ कहने के जोखिम पर, आपको उन कोड को लिखने की आदत नहीं डालनी चाहिए जो धागे को मारते हैं, यह आपको या आपके कैरियर को लंबे समय में मदद नहीं करेगा। इस पोस्ट को देखें (या इसके जैसे कई) कारणों के लिए क्यों नहीं धागे को मारने के लिए।
5

1

आईओएस में मल्टीथ्रेडिंग का सबसे अच्छा तरीका जीसीडी (ग्रैंड सेंट्रल डिस्पैच) का उपयोग करना है।

//creates a queue.

dispatch_queue_t myQueue = dispatch_queue_create("unique_queue_name", NULL);

dispatch_async(myQueue, ^{
    //stuffs to do in background thread
    dispatch_async(dispatch_get_main_queue(), ^{
    //stuffs to do in foreground thread, mostly UI updates
    });
});

0

मैं उन सभी तकनीकों की कोशिश करूंगा जो लोगों ने पोस्ट की हैं और देखें कि यह सबसे तेज़ है, लेकिन मुझे लगता है कि यह ऐसा करने का सबसे अच्छा तरीका है।

[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil];

यह थ्रेड को कम प्राथमिकता में लॉन्च करता है। Gcd का उपयोग थ्रेडिंग के लिए सबसे अच्छा तरीका है।
कर्स्टन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.