2011-06-08 7 views
21

चलाएं तो मैं एक नया एनएसटीएचड शुरू कर रहा हूं जिसे मैं performSelector:onThread:... पर कॉल करके बाद में उपयोग करने में सक्षम होना चाहता हूं। मैं इसे समझने के तरीके से कहता हूं कि उस पद्धति को उस थ्रेड पर रनलोप में कॉल करें, इसलिए इसके अगले पुनरावृत्ति पर यह इन सभी कॉलों को पॉप करेगा और बाद में उन्हें कॉल करने के लिए कुछ भी नहीं छोड़ा जाएगा। तो मुझे इस तरह की कार्यक्षमता की आवश्यकता है, एक निष्क्रिय धागा काम के लिए तैयार है जिसे मैं बस उस पर बुला सकता हूं। मेरे वर्तमान कोड इस तरह दिखता है:एनएसटीएचडी को जिंदा रखें और एनएसआरन लूप को

- (void)doInitialize 
    { 
     mThread = [[NSThread alloc] initWithTarget:self selector:@selector(runThread) object:nil]; 
     [mthread start]; 
    } 

    - (void)runThread 
    { 
     NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 

     // From what I understand from the Google machine is that this call should start the 
     // runloop on this thread, but it DOESN'T. The thread dies and is un-callable 
     [[NSRunLoop currentRunLoop] run]; 

     [pool drain]; 
    } 

    - (void)scheduleSomethingOnThread 
    { 
     [self performSelector:@selector(hardWork) onThread:mThread withObject:nil waitUntilDone:NO]; 
    } 

लेकिन धागा जिंदा रखा नहीं है, और performSelector: onThread कुछ भी नहीं है। मैं इस बारे में सही तरीके से कैसे जा सकता हूं?

उत्तर

15

एक रन लूप को चलाने के लिए कम से कम एक "इनपुट स्रोत" की आवश्यकता होती है। मुख्य रन लूप करता है, लेकिन आपको कुछ भी करने के लिए द्वितीयक रन लूप की -run विधि प्राप्त करने के लिए मैन्युअल रूप से एक स्रोत जोड़ना होगा। इस here पर कुछ दस्तावेज हैं।

इसे काम करने के लिए एक भद्दा तरीका केवल एक अनंत लूप में [[NSRunLoop currentRunLoop] run] डालना होगा; जब कुछ करने के लिए होता है, तो यह करेगा, और तुरंत अन्यथा वापस आ जाएगा। समस्या यह है कि धागा प्रोसेसर समय की एक सभ्य राशि लेगा जो बस कुछ होने की प्रतीक्षा कर रहा है।

एक और समाधान यह चलाने के लिए इस रन लूप पर एनएसटीमर स्थापित करना है।

लेकिन, यदि संभव हो, तो आपको इस तरह की चीज़ के लिए डिज़ाइन की गई एक तंत्र का उपयोग करना चाहिए। यदि संभव हो, तो आप पृष्ठभूमि संचालन के लिए NSOperationQueue का उपयोग करना चाह सकते हैं।

+0

धन्यवाद धागा मजबूर करना चाहिए यह अब थोड़ा स्पष्ट है। – ErikPerik

+4

यह कमांड लाइन उपकरण में मुख्य रन लूप के बारे में भी सच है। यह एनएस/यूआईएप्लिकेशंस है जो जीयूआई एप्लिकेशन में मुख्य रन लूप पर डिफ़ॉल्ट इनपुट स्रोत प्रदान करता है। –

8

कोड के इस टुकड़े, हमेशा के लिए प्रतीक्षा करने के लिए

BOOL shouldKeepRunning = YES;  // global 
NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; // adding some input source, that is required for runLoop to runing 
while (shouldKeepRunning && [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); // starting infinite loop which can be stopped by changing the shouldKeepRunning's value 
संबंधित मुद्दे