2012-11-13 12 views
6

में दो धागे बनाएं मैं एक्सकोड और ऑब्जेक्टिव-सी के लिए बहुत नया हूं, इसलिए मुझे वास्तव में पता नहीं है कि मैं अभी तक क्या कर रहा हूं! ;-)
असल में मैं एक आईफोन एप्लिकेशन चाहता हूं जो संभवतः दो धागे चला सकता है, जो बाद में अन्य ऐप्स के साथ संवाद करने के लिए UDP Sockets का उपयोग करेगा।उद्देश्य-सी

मैंने प्रतिक्रिया करने के लिए फ़ंक्शंस डाल दिए हैं जब UI में start-Thread/stop-Thread बटन दबाया जाता है, अब मैं उन्हें वास्तव में बनाने और थ्रेड शुरू करने के लिए कोड के साथ भरना चाहता हूं।

  • यहां सही प्रक्रिया क्या होगी?
  • क्या मुझे NSThread उपclass करने की आवश्यकता है?
  • मैं कोड को कहां लागू कर सकता हूं, कि नए धागे निष्पादित होंगे?

    मुझे एक रन विधि या कुछ समान नहीं दिखाई दे रहा है। मुझे लगता है कि selector के साथ कुछ करने के लिए कुछ है, जो मुझे समझ में नहीं आता है।

+0

[थ्रेडिंग प्रोग्रामिंग गाइड] (http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html) और [NSThread संदर्भ] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html)। यदि आप 'NSThread' subclass करते हैं, तो आप आमतौर पर 'मुख्य' विधि को ओवरराइड करेंगे। – omz

+5

मेरा सुझाव है कि आप [प्रेषण कतार] का उपयोग करें (http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102 -एसडब्ल्यू 24) इसके बजाए। – Kevin

+0

मैं दूसरी प्रेषण कतार। – Wevah

उत्तर

14

dispatch queues का उपयोग करें। वे अनिवार्य रूप से हल्के धागे हैं जिनके लिए आपको सीधे थ्रेडिंग या क्यूइंग के बारे में चिंता करने की आवश्यकता नहीं है।

-(void) spawn 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     [self doWorkInBackground]; 
    }); 
} 

आप अंतर्निहित कतारों में से एक या स्वयं का उपयोग कर सकते हैं।

और आपको शायद blocks पर भी पढ़ना चाहिए, विशेष रूप से स्मृति प्रबंधन पहलू।

+0

हाय उत्तर के लिए धन्यवाद, मैंने गाइड पढ़ना शुरू कर दिया। हालांकि, जहां तक ​​मैं इसे अब समझता हूं, हम धारावाहिक या समवर्ती कतार प्राप्त कर सकते हैं। सीरियल वाले में, किसी भी समय केवल एक ही कार्य निष्पादित किया जाता है, जो मेरे लिए पर्याप्त नहीं है, क्योंकि वहां दो कार्य एक साथ हो सकते हैं। तो मुझे एक समवर्ती कतार की आवश्यकता होगी, हालांकि सिस्टम प्रबंधन करता है कि कितने कार्य समानांतर चलते हैं। हालांकि, उपयोगकर्ता को उनकी आवश्यकता होने पर, मुझे वास्तव में दो कार्यों को चलाने की आवश्यकता है। आम तौर पर मुझे 2 ब्लॉक या कार्यों को एक "थ्रेड" निष्पादित करने और उन्हें कतार में रखने की आवश्यकता होगी? – user1809923

+0

चूंकि ब्लॉक शेष कोड के साथ इनलाइन लिखे गए हैं, और मुझे प्रत्येक थ्रेड के लिए एक ब्लॉक होना चाहिए और धागे इतने छोटे नहीं हैं, मुझे आश्चर्य है कि कोड-ओवरव्यू पर विचार करने के लिए वास्तव में सही तरीका है या नहीं। – user1809923

+0

आप लाइन से बाहर ब्लॉक को घोषित कर सकते हैं ठीक है –

1
- (void)performBlockInBackground:(void (^)())block { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     block(); 
    }); 
} 

तो फिर आप इसे इस तरह कहते हैं:

[self performBlockInBackground:^{ 
    NSLog(@"Log from background"); 
}]; 
+0

यदि आप यह जांच नहीं करते हैं कि ब्लॉक न्यूल नहीं है तो वह विधि क्रैश हो जाएगी। – danielbeard

+0

@ डैनियलबीर्ड हां बेशक, लेकिन पृथ्वी पर क्यों आप '[स्वयं प्रदर्शनब्लॉकइनबैकग्राउंड: एनयूएलएल] कहेंगे;'? – NSAddict

+0

यदि ब्लॉक किसी भिन्न ऑब्जेक्ट पर संग्रहीत होता है और इसे हटा दिया जाता है, तो ब्लॉक शून्य होगा। जैसे 'someObject.actionBlock' – danielbeard

1

आप भी NSOperation उपयोग करने पर विचार कर सकते हैं। यह हुड के नीचे प्रेषण कतारों का उपयोग करता है, लेकिन उच्च स्तरीय एपीआई और चालू संचालन को रद्द करने की संभावना प्रदान करता है (जो आपके लिए सहायक हो सकता है)।

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

  • कोई संबंधित समस्या नहीं^_^