2012-08-30 23 views
6

नहीं बनाता, तो मैं टाइमर को अमान्य कैसे कर सकता हूं मैं एनएसटीमर ऑब्जेक्ट नहीं बनाना चाहता हूं। मैं टाइमर को कैसे अमान्य कर सकता हूं? मैं देखने में टाइमर को अमान्य करना चाहता हूं।जब मैं एनएसटीमर ऑब्जेक्ट

-(void) viewDidLoad 
{ 
[super viewDidLoad]; 
[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; 
} 
+0

* मेरा मतलब क्या है * मैं एनएसटीमर ऑब्जेक्ट * बनाना नहीं चाहता हूं? आप पहले से ही 'ScheduleTimerWithTimeInterval' का उपयोग करके एक बनाते हैं। – sch

+0

मेरा मतलब है कि मैं अपने द्वारा बनाए गए टाइमर पर नहीं रोकता हूं। क्या यह संभव है? – Voloda2

उत्तर

3

एक आप

आप टाइमर को पकड़ने की है बनाने के लिए:

@interface MONObject() 
@property (nonatomic, retain) NSTimer * timerIvar; 
@end 

@implementation MONObject 
... 
- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
self.timerIvar = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; 
} 

- (void)invalidateTimer 
{ 
    [self.timerIvar invalidate]; 
    self.timerIvar = nil; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    ... 
    [self invalidateTimer]; 
} 

बी

एक और विकल्प टाइमर कि पारित हो जाता है रद्द करने के लिए किया जाएगा कॉलबैक में, लेकिन यह viewDidUnload: के भीतर नहीं होगा। इसलिए, यह काफी इस परिदृश्य में लागू नहीं होता:

- (void)onTimer:(NSTimer *)pTimer 
{ 
    [pTimer invalidate]; 
} 
0

हो सकता है कि इस प्रक्रिया में मदद कर सकते हैं:

[self performSelector:@selector(onTimer:) withObject:nil afterDelay:10]; 
1

आप टाइमर को रद्द करने में सक्षम होना चाहते हैं, तो आप का उल्लेख करने के लिए है टाइमर आप रद्द कर रहे हैं, और इसका मतलब है कि आपको पॉइंटर को टाइमर पर रखना होगा, जस्टिन का जवाब देखें।

टाइमर का संदर्भ रखना इसे करने का सही तरीका है, लेकिन पूर्णता के लिए आप -performSelector:withObject:afterDelay: विधि को गरीब व्यक्ति के टाइमर के रूप में भी उपयोग कर सकते हैं। उस कॉल को +cancelPreviousPerformRequestsWithTarget: का उपयोग करके अमान्य किया जा सकता है। नमूना कोड:

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self performSelector:@selector(timerTick) withObject:nil afterDelay:10]; 
} 

और फिर:

- (void) viewWillDisappear 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
    [super viewWillDisappear]; 
} 

लेकिन यह यह करने के लिए सही तरीके से, क्योंकि वहाँ अन्य प्रदर्शन-चयनकर्ता अपने उद्देश्य यह है कि आप रद्द करना चाहते पर लंबित अनुरोध हो सकता है नहीं है। अपने टाइमर को चारों ओर रखना सबसे अच्छा है, इस तरह आप जानते हैं कि आप वास्तव में क्या रद्द कर रहे हैं।

वैसे भी, -viewDidLoad में टाइमर चलाने के लिए शायद यह एक बुरा विचार भी है। लोड होने पर देखने के किसी भी संबंध के बिना लोडिंग कभी भी हो सकती है।

0

यदि आप अपने टाइमर को नहीं रखना चाहते हैं, तो एनएसटीमर ऑब्जेक्ट टाइमर विधि (आपके मामले में टाइमर :) में पारित किया जाएगा, इसलिए उस विधि में आप जांच सकते हैं कि टाइमर अभी भी जरूरी है और अमान्य है यह। हालांकि, टाइमर को अमान्य करने से पहले दृश्य वापस आने पर आप परेशानी में भाग लेंगे, और आप एक नया बनाते हैं।

टाइमर को एक आवृत्ति चर में स्टोर करने का सबसे अच्छा तरीका है। यह काम करता है, कोई चतुर चाल नहीं है, और आप छह महीने बाद पता चलेगा कि आपने क्या किया। मैं शायद लिखते हैं एक

@property (readwrite, nonatomic) BOOL hasTimer; 

गेटर रिटर्न हाँ iff टाइमर शून्य नहीं है, सेटर टाइमर को अमान्य कर या एक नया बनाता है।

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