2010-02-07 19 views
6

मैं सफलतापूर्वक एनएसटीमर का उपयोग कर रहा हूं, लेकिन अब इसके साथ परेशानी हो रही है। निस्संदेह कुछ बेवकूफ। आंखों का एक और सेट की सराहना करते हैं। डीबगर चलाना, मुझे लगता है कि एप्लीकेशनडिडफिनिश लांचिंग कहा जाता है, लेकिन ट्रिगर को कभी नहीं कहा जाता है।NStimer - मैं यहाँ क्या गलत कर रहा हूँ?

-(void) trigger:(NSTimer *) theTimer{ 
    NSLog(@"timer fired"); 
} 

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger) userInfo:nil repeats:YES]; 

    [window makeKeyAndVisible]; 
} 
+0

साथ ही साथ जो कहा गया है, आपको कचरा संग्रह का उपयोग न करने पर टाइमर को बनाए रखना होगा। –

+2

यदि आप लूप चलाने के लिए टाइमर जोड़ते हैं, तो इसे बनाए रखने की कोई आवश्यकता नहीं है, मुझे लगता है कि रन लूप इसे बरकरार रखता है। – Jaanus

+0

विधि हस्ताक्षर त्रुटि को पकड़ने के लिए सभी को धन्यवाद। दूसरी बात जो मुझे ट्रिप कर रही थी वह यह है कि मैं _had_ शेड्यूल टाइमर विथ इंटरवल का उपयोग कर रहा हूं, जिसे रन लूप में मैन्युअल अतिरिक्तता की आवश्यकता नहीं होती है। इस मामले में हालांकि, मैं निर्धारित टाइमर भाग के बारे में भूल गया था। – morgancodes

उत्तर

13

चयनकर्ता निम्नलिखित हस्ताक्षर होना चाहिए:

- (void)timerFireMethod:(NSTimer*)theTimer 

ताकि आप की जरूरत है

@selector(trigger:) 

--edit--

शायद तुम और ने इस कहीं कर रहे हैं, लेकिन कोड में आपने शामिल किया है कि आप वास्तव में टाइमर शुरू नहीं करते हैं। किसी भी घटना को ट्रिगर करने से पहले आपको इसे NSRunLoop में जोड़ना होगा।

[[NSRunLoop currentRunLoop] addTimer:nst forMode:NSDefaultRunLoopMode]; 

यदि मैं सही ढंग से उदाहरण पढ़ता हूं। मैंने केवल एक इनिट विधि का उपयोग किया है जो स्वचालित रूप से इसे वर्तमान NSRunLoop में जोड़ता है। आपको वास्तव में डेवलपर दस्तावेज़ों को देखना चाहिए जो किसी ने मेरी पोस्ट में टिप्पणियों में शामिल किया था।

+1

bleh बहुत धीमी गति से फिर से, खेद नूह :) – willcodejavaforfood

+0

+1 यहाँ प्रासंगिक दस्तावेज है: http://developer.apple.com/mac/library/documentation/cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html # // apple_ref/OCC/clm/NSTimer/timerWithTimeInterval: लक्ष्य: चयनकर्ता: userInfo: दोहराता: –

+1

स्पष्ट करने के लिए: -: विधि नाम का हिस्सा है। वास्तव में: एक तर्क के साथ एक विधि के लिए एक पूरी तरह से वैध विधि नाम है। –

1

चयनकर्ता आप टाइमर, trigger दे रहे हैं, पता चलता है कि यह एक तरीका है कि कोई पैरामीटर लेता फोन करना चाहिए। या तो

- (void)trigger 
{ 
     // look at me, I don't take any parameters 
     NSLog(@"timer fired"); 
} 

करने के लिए अपने टाइमर आधारित पद्धति को बदलने या @selector(trigger:) उपयोग करने के लिए अपने प्रारंभिक टाइमर कॉल बदल जाते हैं।

+1

टाइमर कॉलबैक एक तर्क तो "ट्रिगर" करने के लिए विधि का नाम भी बदलकर होना आवश्यक है –

+2

@jib काम करने के लिए नहीं जा रहा है - नहीं है कि सच नहीं है। टाइमर कॉलबैक एनएसटीमर तर्क के बिना ठीक काम करता है। मेरे पास हर व़क्त करने को यही काम है। –

2

दो बातें:

1) दूसरों के रूप में कहते हैं, विधि निम्न हस्ताक्षर करना चाहिए था ..

-(void) trigger:(NSTimer *) theTimer; 

और आप टाइमर इस प्रकार हैं:

nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger:) userInfo:nil repeats:YES]; 

2) केवल टाइमर बनाने से यह नहीं चलता है। the documentation says के रूप में:

आप एक रन पाश करने के लिए नए टाइमर जोड़ना होगा, का उपयोग कर addTimer: forMode :. फिर, सेकंड के बाद समाप्त हो गया है, टाइमर आग, आमंत्रण का आह्वान। ( टाइमर को दोहराने के लिए कॉन्फ़िगर किया गया है, वहाँ बाद में रन पाश को टाइमर फिर से जोड़ने की आवश्यकता नहीं है।)

यहाँ वास्तविक कामकाज कोड का एक टुकड़ा है कि आप के बाद मॉडल कर सकते हैं है। टाइमर निर्माण आपके जैसा ही है, लेकिन यह इसे सही तरीके से चलाने के लिए भी जोड़ता है।

[[NSRunLoop currentRunLoop] addTimer: 
    [NSTimer timerWithTimeInterval:0.1 
          target:self 
          selector:@selector(someSelector:) 
          userInfo:nil 
          repeats:NO] 
           forMode:NSDefaultRunLoopMode]; 
+4

+1 यह सही है। आप 'निर्धारित टाइमर ...' सुविधा विधियों का भी उपयोग कर सकते हैं जो आपके लिए रन लूप में टाइमर जोड़ देंगे। –

0

आपकी समस्या तथ्य यह है कि timerWithTimeInterval:target:selector:userInfo:repeats: एक टाइमर बनाता है लेकिन नहीं अनुसूची रन पाश पर, आप इसे अपने आप को क्या करना है करता है के कारण है।scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

0

मैं एक समस्या थी ही मुख्य थ्रेड में नहीं - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { में टाइमर शुरू कर:

हालांकि, अगर आप भी इस विधि है जो घड़ी और कार्यक्रम यह बनाता रन पाश पर उपयोग कर सकते हैं।

dispatch_async(dispatch_get_main_queue(), ^{ 
[self startScheduledTimer]; 
}); 
संबंधित मुद्दे