2012-06-15 14 views
28

मैंने अपनी परियोजना में इसे लागू करने से पहले टाइमर के साथ एक परीक्षण आवेदन बनाया है। यह पहली बार था जब मैं टाइमर का उपयोग कर रहा हूं। लेकिन मुद्दा यह है कि जब मैंने [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ]; का उपयोग कर टाइमर लागू किया, तो यह काम नहीं कर रहा है। यहाँ मेरी कोड, इंटरफेस है:एनएसटीमर टाइमरविथटाइम इंटरवल: काम नहीं कर रहा

@interface uialertViewController : UIViewController 
{ 

    NSTimer *timer; 
} 

-(void)displayAlert; 
-(void)hideandview; 
@end 

कार्यान्वयन:

@implementation uialertViewController 
- (void)viewDidLoad { 

    [self displayAlert]; 
    [super viewDidLoad]; 
} 


-(void)displayAlert{ 

    timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(hideandview) userInfo:nil repeats:NO]; 

    alert = [[UIAlertView alloc] initWithTitle:@"testing" message:@"hi hi hi" delegate:nil cancelButtonTitle:@"continue" otherButtonTitles:nil]; 
    [alert show]; 




    [alert release]; 
    alert = nil; 

} 

-(void)hideandview{ 

    NSLog(@"triggered"); 

    [alert dismissWithClickedButtonIndex:0 animated:YES]; 

    [alert release]; 

    [self displayAlert]; 
} 

@end 

तब मैं[NSTimer scheduledTimerWithTimeInterval: target: selector:userInfo: repeats: ];, यह काम कर रहा है साथ बदल दिया[NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];timerWithTimeInterval: के साथ समस्या क्या थी? क्या मैं अपने पहले कार्यान्वयन में कुछ भी कर रहा हूं? अग्रिम में धन्यवाद।

+0

टाइमरविथटाइमइंटरवाल टाइमर बनाता है लेकिन इसे शुरू नहीं करता है और शेड्यूल करता है ... करता है। मुझे लगता है कि एकमात्र अंतर – rooster117

+0

@ rooster117 है: तो मुझे टाइमर फायर विधि कॉल करने की आवश्यकता है, क्या मैं सही हूँ? –

+0

हाँ या बस जब आप इसे प्रारंभ करना चाहते हैं तो टाइमर विथटाइम इंटरवल को कॉल करें। किसी भी तरह से – rooster117

उत्तर

115

scheduledTimerWithTimeInterval:invocation:repeats: और scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: टाइमर कि स्वचालित रूप से एक NSRunLoop जोड़ दिए जाते हैं, जिसका अर्थ है आप स्वयं उन्हें जोड़ की जरूरत नहीं है कि बनाने के लापता हैं। उन्हें NSRunLoop में जोड़ा जाने से उन्हें आग लगने का कारण बनता है।

timerWithTimeInterval:invocation:repeats: साथ

और timerWithTimeInterval:target:selector:userInfo:repeats:, तो आप इस तरह मैन्युअल रूप से एक रन पाश करने के लिए टाइमर जोड़ने के लिए, कोड के साथ है:

[[NSRunLoop mainRunLoop] addTimer:repeatingTimer forMode:NSDefaultRunLoopMode]; 

यहां पर अन्य उत्तर सुझाव है कि आप अपने आप को fire कॉल करने के लिए की जरूरत है। आप नहीं करते - जैसे ही टाइमर को रन लूप पर रखा गया है, इसे जल्द ही बुलाया जाएगा।

+0

ग्रेट स्पष्टीकरण! धन्यवाद! – kev

+2

अनुसूचित विधि के साथ भी, यदि कमांड लाइन उपयोग में चल रहा है, तो आपको अभी भी इसे अपने अनुभव में कम से कम मेनरुनूप जोड़ने की आवश्यकता है, साथ ही साथ इंगित किया गया है: [रन रन रन nsrunloop] (http: // hackazach.net/code/2013/08/09/run-run-run-nsrunloop/) – jheld

+0

शेड्यूलर टाइमर को आग लगाने के बिना इस सुझाव के साथ पूरी तरह से काम किया। धन्यवाद – hitme

1

दोनों के बीच का अंतर यह है कि timerWithTimeInterval विधि NSTimer ऑब्जेक्ट देता है जिसे अभी तक निकाल दिया नहीं गया है। टाइमर को आग लगाने के लिए आपको [timer fire]; का उपयोग करना होगा दूसरी तरफ scheduledTimerWithTimeInterval एक NSTimer लौटाता है जिसे पहले ही निकाल दिया गया है।

तो, अपने पहले कार्यान्वयन में तुम सिर्फ [timer fire];

+4

मेरी पोस्ट देखें- '[टाइमर आग]' टाइमर "शुरू नहीं होता है, यह बस उस विधि को सीधे कॉल करता है। शुरू करने के लिए आपको टाइमर को रन लूप में जोड़ना होगा। –

+1

वाह, मुझे इसके बारे में पता नहीं था, ओपी को आपका जवाब स्वीकार करना चाहिए। –

+0

यह एक बार के लिए काम करता है लेकिन निरंतर प्रक्रिया के लिए @ जोसेफ हम्फ्रे कोड का उपयोग करता है। – yazh

2

कोई भी मुख्य धागे पर टाइमर जोड़ने के लिए सुनिश्चित करना चाहता है।

assert(Thread.isMainThread) 
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(YourSelector), userInfo: nil, repeats: true)