2012-10-13 15 views
21

एंड्रॉयड में दूसरों लोगों से मुख्य थ्रेड में कुछ कोड को चलाने के लिए कई तरीके हैं से बुला में कोड को चलाने के लिए?कैसे यूआई धागा दूसरों लोगों

dispatch_async(dispatch_get_main_queue(), ^{ 

    }); 

कुछ और?

अग्रिम धन्यवाद।

+1

आपका सभी कोड मुख्य धागे में चलता है, जब तक आप इसे अन्यथा नहीं बताते। – jrturton

+0

इसे इंगित करने के लिए धन्यवाद, मैंने प्रश्न संपादित किया है। – pvllnspk

उत्तर

36

पसंदीदा तरीका आजकल GCD उपयोग कर रहा है, कोड आप अपने प्रश्न में उद्धृत के साथ:

dispatch_async(dispatch_get_main_queue(), ^{ 
    // Your code to run on the main queue/thread 
}); 

आप GCD तुलना में एक अधिक वस्तु उन्मुख दृष्टिकोण का उपयोग कर पसंद करते हैं, तो आप भी उपयोग कर सकते हैं एक NSOperation (एक तरह NSBlockOperation) और इसे [NSOperationQueue mainQueue] पर जोड़ें।

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
    // Your code to run on the main queue/thread 
}]; 

यह करता dispatch_async(dispatch_get_main_queue(), …) के रूप में काफी एक ही बात, उन्मुख किया जा रहा अधिक ऑब्जेक्टिव-सी/पू कि सादा सी GCD समारोह का लाभ दिया है, लेकिन NSOperation वस्तुओं बनाने के लिए स्मृति को आबंटित करने की आवश्यकता होगी, की सबसे बड़ी खामी है , जबकि आप सादा सी और जीसीडी का उपयोग कर इससे बच सकते हैं।


मैं GCD का उपयोग करना चाहिये, लेकिन वहाँ अन्य तरीकों से, उन दो तरह है जो आप मुख्य थ्रेड से एक दिया वस्तु पर एक चयनकर्ता (विधि) कॉल करने की अनुमति कर रहे हैं:

  • - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait (विधि NSObject की यह किसी भी वस्तु पर कहा जा सकता है तो)
  • [NSRunLoop mainRunLoop]

लेकिन उन solut पर - (void)performSelector:(SEL)aSelector target:(id)target argument:(id)anArgument order:(NSUInteger)order modes:(NSArray *)modes भेजें आयनों को जीसीडी या NSOperation वाले के रूप में लचीला नहीं है, क्योंकि वे केवल आपको मौजूदा विधियों को कॉल करने देते हैं (इसलिए आपकी ऑब्जेक्ट में ऐसी विधि होनी चाहिए जो पहले से मौजूद है और जो आप करना चाहते हैं), जबकि जीसीडी या -[NSOperationQueue addOperationWithBlock:] आपको मनमाने ढंग से पारित करने की अनुमति देता है कोड (ब्लॉक का उपयोग कर)।

+0

अली सॉफ्टवेयर, बहुत धन्यवाद – pvllnspk

+1

ध्यान दें कि '[NSOperationQueue mainQueue] 'के बजाय, आप बस' NSOperationQueue.mainQueue' लिख सकते हैं। –

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