2012-03-30 19 views
5

मैं एक कार्यकर्ता धागा कि मुख्य थ्रेड तो मैं कॉल कर सकते हैं नहीं है बनाना चाहते हैं, बिना प्रदर्शन मुख्य थ्रेड नहीं है ...मैं एक NSThread कि एक चयनकर्ता तुरंत

[self performSelector:@selector(doStuff) OnThread:self.myWorkerThread withObject:nil]; 

कैसे बना सकता हूँ। .. मेरे कोड में स्थानों के एक गुच्छा में। मैं धागा कैसे बना सकता हूं .. कोई धागा और इसे एक चर के लिए असाइन करें ताकि मैं इसे अपने कोड में और अधिक उपयोग कर सकूं। NSThread detachNewThreadWithSElector केवल एक चयनकर्ता को चलाने के उद्देश्य के लिए एक बना देगा। मुझे एक धागा बनाने और किसी भी तरह इसका उपयोग करने की जरूरत है।

मैं आईओएस का उपयोग कर रहा हूं और एक लेखक थ्रेड पर अपने सभी कोरडाटा लिखने की जरूरत है। मुझे हर समय एक ही थ्रेड (जो मुख्य नहीं है) का उपयोग करने की आवश्यकता है।

उत्तर

4

मैं अत्यधिक इसके बजाय ग्रैंड सेंट्रल डिस्पैच में देखने की सलाह देता हूं :)। आप dispatch_queue_create के माध्यम से आसानी से एक प्रेषण कतार बना सकते हैं या मौजूदा समवर्ती धागे में से एक प्राप्त कर सकते हैं और जो कुछ भी आप चाहते हैं उसे भेज सकते हैं। यह काम का बोझ/ओएस स्थिति, आदि यह इस तरह दिखेगा के आधार पर धागे की उपयुक्त संख्या पैदा करेगा:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue, ^{ 
    //Do stuff 
}); 

या आप अपने एन एस समकक्ष, NSOperation पर गौर कर सकते हैं। मुझे बस एनएसटीएचडी के साथ ऐसा करने का कोई तरीका नहीं पता। ऐसा लगता है कि अपने चयनकर्ता को सेट करने का एकमात्र तरीका इसे एक साथ रखना है।

संपादित तुम सिर्फ एक धागा चाहते हैं, बस [[NSThread alloc] init] फोन: p

को और संपादित: iPhone: how to use performSelector:onThread:withObject:waitUntilDone: method?

इस जवाब के अनुसार, यह स्थापित करने के लिए मुश्किल होने जा रहा है, क्योंकि प्रत्येक थ्रेड को "मुख्य" फ़ंक्शन की आवश्यकता होती है जब यह बनाया जाता है या अन्यथा यह कुछ भी नहीं करेगा ...

+0

इसके लिए धन्यवाद .. मैंने अपने प्रश्न को अधिक जानकारी के साथ अपडेट किया है। –

+0

मैंने अपना जवाब – borrrden

+0

अपडेट किया है यदि मैं करता हूं तो चयनकर्ता विथ थ्रेड: [एनएसटीएचड मुख्य थ्रेड] यह ठीक काम करता है लेकिन प्रदर्शन चयनकर्ता विथ थ्रेड: [[एनएसटीएचएड आवंट] init] फ्रीज करता है और कुछ भी नहीं करता है :(.. मैंने इसे आवंटित करने के बाद 'स्टार्ट' को कॉल करने का प्रयास किया लेकिन यह कुछ भी नहीं करता है। –

2

ऐसा लगता है कि ब्लॉक का उपयोग करना सबसे आसान तरीका है रों:

void (^now)(void) =^{ 
    NSDate *date = [NSDate date]; 
    NSLog(@"The date and time is %@", date); 
}; 

और कॉल:

now(); 

NSBlockOperation या dispatch_async()।

अधिक देखें: http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1

+0

मैं आईओएस पर हूं ... क्या वे केवल मैक नहीं हैं? –

+1

आईओएस पर कोई ब्लॉक इस्तेमाल नहीं किया जाता है। आप किस एसडीके का उपयोग कर रहे हैं? वे समर्थित हैं 4 और 5. –

1

आप विशेष रूप से कोर डाटा (के रूप में अपने प्रश्न का सुझाव) के साथ बातचीत करने यह कर रहे हैं, और आप अपने ऐप्स के लिए iOS 5 की आवश्यकता होती है सकते हैं, आप नए निजी कतार जांच करने के लिए चाहते हो सकता है प्रबंधित ऑब्जेक्ट संदर्भ आईओएस 5 में जोड़ा गया है। यह आपके लिए थ्रेड/प्रेषण कतार बनाता है और प्रबंधित करता है, और आप इसे कतार पर चलाने के लिए ब्लॉक भेजते हैं। अधिक जानकारी के लिए the release notes और WWDC session video देखें।

अद्यतन (मई 2016): आईओएस 5 में जोड़ा गया नया एपीआई -[NSManagedObjectContext initWithConcurrencyType:] था। आईओएस 9 के अनुसार, पुराने प्रारंभकर्ता को कतारबद्ध समेकन प्रकार के साथ परिभाषित किया गया है, जो कतार-आधारित समरूपता प्रकारों के परिचय से पहले डिफ़ॉल्ट था। इसलिए यदि आप संदर्भ पहुंच प्रबंधित करने के लिए कतारों का उपयोग नहीं कर रहे हैं, तो मैं दृढ़ता से उस दिशा में आगे बढ़ने की अनुशंसा करता हूं।

मैं विकास के दौरान using the com.apple.CoreData.ConcurrencyDebug launch argument की दृढ़ता से अनुशंसा करता हूं, ताकि आप उन स्थानों को पकड़ने में सहायता कर सकें जहां आप नियम तोड़ रहे हैं।

+0

बहुत रोचक - धन्यवाद। –

+0

लिंक मर चुका है - यही कारण है कि आपको अपने उत्तर में लिंक से कुछ सामग्री शामिल करनी चाहिए। –

2

आप वास्तव में इस चाहते हैं और नहीं GCD, तो का उपयोग कर:

NSThread *thr = [[NSThread alloc] initWithTarget:anobject selector:@selector(doStuff) object:nil]; 

और यह आपके वस्तु जब चाहें पर उचित विधि कॉल करेगा - हालांकि मुझे लगता है NSThread का वर्तमान क्रियान्वयन नहीं होता है कि लक्ष्य और चयनकर्ता को बदलने की अनुमति नहीं है।

+0

मुझे जो चाहिए वह पीछे की ओर है। समय-समय पर मैं मूल डेटा लिखता हूं और मैं करना चाहता हूं यह एक निर्दिष्ट थ्रेड (स्टार्टअप पर) पर है, इसलिए मेरे पास एकाधिक NSManagedObjectContexts नहीं हैं। इसलिए मुझे प्रदर्शन करने की आवश्यकता है ITThread: <पहले designat एड थ्रेड> –

+0

गायब: \t [thr start]; :) – ingconti