2011-01-23 18 views
10

मैं बनाने रहा हूँ के बाद दोहरा नहीं और फायरिंग NSTimer के साथ एक:iPhone - NSTimer आग

@property (nonatomic, retain) NSTimer *ncTimer; 

कुछ लोगों के लिए:

ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
              target:self 
             selector:@selector(handleTimer:) 
             userInfo:nil 
              repeats:YES]; 
[ncTimer fire]; 

और

- (void)handleTimer:(NSTimer *)chkTimer { 
    // do stuff 
} 

मैं के साथ मेरी घड़ी को बनाए रखना कर रहा हूँ कारण टाइमर दोहराना नहीं है। यह केवल एक बार फिर से और फिर से फायरिंग है।

+0

* मेरी ओर से एक बेवकूफ सवाल है, लेकिन यह सबसे अच्छा सुनिश्चित करने के लिए है: * मुझे लगता है आप handleTimer विधि के अंदर कहीं भी टाइमर अमान्य नहीं कर रहे हैं? –

+0

नहीं, मैं नहीं हूं .. केवल एक चीज जो मुझे जोड़नी है वह यह है कि मैं दृश्य में टाइमर को फायर कर रहा हूंडिडलोड विधि – Zigglzworth

उत्तर

7

तुम बस घड़ी है कि आप अपने शीर्षक में एक संपत्ति के रूप में डाल दिया है करने के लिए असाइन नहीं कर सकते:

घोषणा मान लिया जाये कि सदस्य वस्तु आप करने की आवश्यकता होगी के भीतर है। यह काम करना चाहिए:

self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];

इसके अलावा: अग्नि विधि चक्र से बाहर टाइमर को आग लगती है। यदि टाइमर दोहराना नहीं है तो यह अवैध है। लाइन है कि आग का कहना है के बाद, इस जोड़ें:


BOOL timerState = [ncTimer isValid]; 
NSLog(@"Timer Validity is: %@", [email protected]"YES":@"NO"); 
+1

बनी हुई है "टाइमर वैधता है: हाँ" लेकिन अभी भी कोई भाग्य नहीं है ... टाइमर दोहराना नहीं है। यहां क्या समस्या हो सकती थी? – Zigglzworth

+0

मैंने अभी यह देखने के लिए एक छोटा परीक्षण ऐप बनाया है कि यह मेरे साथ ठीक काम करता है। क्या आपके पास अपने कार्यान्वयन के शीर्ष पर @ सिंथेसाइज एनसीटीमर है? –

+0

हाँ मुझे यह मिला है ... मैंने इसे कई अन्य ऐप्स में किया है और यह ठीक काम करता है, इसलिए मैं यह नहीं समझ सकता कि – Zigglzworth

3

ncTimer पर असाइन करना जैसा कि आपने गुण retain कार्यक्षमता शुरू नहीं की है।

self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES] 
+0

मैंने स्वयं को जोड़ा। लेकिन समस्या – Zigglzworth

34

-fire: विधि मैन्युअल रूप से यह एक बार सक्रिय करता है। एक टाइमर शुरू किया जा करने के लिए और दोहराने, आप इसे यहाँ

काम कर बनाया एक runloop का उपयोग कर [[NSRunLoop currentRunLoop] addTimer: forMode:]

+14

यह सही है, लेकिन रन लूप को मैन्युअल रूप से जोड़ने के बजाय 'NSTimer'' ScheduleTimerWith ... 'विधियों का उपयोग करना आसान है । –

19

यह

समझे mainRunLoop लिए टाइमर जोड़ने में जोड़ने के लिए है तुम जाओ:

उद्देश्य सी :

self.ncTimer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

स्विफ्ट:

var ncTimer = NSTimer(timeInterval: 2.0, target: self, selector: Selector("handleTimer"), userInfo: nil, repeats: true) 
NSRunLoop.mainRunLoop().addTimer(ncTimer, forMode: NSDefaultRunLoopMode) 
+0

उद्देश्य सी 'self.ncTimer' के बजाय 'NSTimer * ncTimer' नहीं होगा? साथ ही, क्या आप 'addTimer: timer'' के बजाय 'addTimer: ncTimer' नहीं कहेंगे? मेरे पास इसे संपादित करने की शक्ति है, लेकिन मैं चाहता हूं कि आपको पता होना चाहिए कि क्या करने की आवश्यकता है। – Volomike

+0

मुझे भी, यह मेरे लिए काम करता था लेकिन 'शेड्यूल टाइमर विथटाइम इंटरवल' नहीं था – Husam

6

आप इस ब्लॉक के अंदर अपना कोड भी कॉपी कर सकते हैं, जो मुख्य धागे में टाइमर के निर्माण को सम्मिलित करता है।

कोड इसलिए रहेगा:

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
       target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES]; 
});