2011-07-19 20 views
10

फायरिंग नहीं मैं एक NSTimer है कि मैं इस कोड के साथ init है:NSTimer

testTimer = [[NSTimer alloc] initWithFireDate:[new objectAtIndex:0] interval:0.0 target:self selector:@selector(works:) userInfo:nil repeats:NO]; 

[new objectAtIndex:0] अतीत में एक NSDate है।

जब मैं अनुप्रयोग शुरू, टाइमर तुरंत की एक fireDate के साथ बनाया जा रहा है, (क्योंकि तिथि अतीत में है), लेकिन यह कभी नहीं मेरे काम प्रणाली को बुलाती है। (-(void)works:(id)sender )

किसी को पता है क्यों यह हो रहा है?

+0

को बदलने के लिए है कि क्या यह इस सवाल में iphone टैग का उपयोग करना गलत है था? – Aravindhan

+6

यह एक मैक ऐप है। –

+1

मैट, आप आईओएस रेटगर्स की भीड़ को रोकने में मदद के लिए [ओएसएक्स] टैग का उपयोग कर सकते हैं। :) –

उत्तर

18

आप वर्तमान रन पाश में जोड़ने के लिए है, तो आप टाइमर वस्तु बनाने के लिए initWith.. विधि का उपयोग करना होगा।

NSRunLoop * theRunLoop = [NSRunLoop currentRunLoop]; 
[theRunLoop addTimer:testTimer forMode:NSDefaultRunLoopMode]; 

या यदि आप यह आप के लिए निर्धारित चाहते हैं, अपने टाइमर बनाने के लिए scheduled... तरीकों का उपयोग।

+0

हाँ, यही वह है। –

+4

@ मैट: यह ध्यान दिया जाना चाहिए कि 'alloc'/'init' का उपयोग करने का अर्थ है कि आप टाइमर के स्वामी हैं और इसकी स्मृति को प्रबंधित करने की आवश्यकता है, जबकि' निर्धारित टाइमर ... 'विधियां एक टाइमर लौटाती हैं जो आप _not_ स्वयं करते हैं। इसे किसी भी मामले में रन लूप द्वारा बनाए रखा जाता है। –

+0

@josh जानकारी के लिए धन्यवाद! –

14

मैं अभी हाल ही में NSTimer के साथ एक समस्या हुई। मेरे मामले में मुझे एहसास नहीं हुआ कि निर्धारित विधि TimerWithTimeInterval बहु थ्रेड सुरक्षित नहीं है। एक बार जब मैंने टाइमर को मुख्य धागे में ले जाया तो यह काम करना शुरू कर दिया।

+1

मैं कैसे पूछ सकता हूं, क्या आपने ऐसा किया? मुझे लगता है कि यह यादृच्छिक रूप से फायरिंग के साथ एक मुद्दा है। –

+5

इसमें अपने nstimer को लपेटने का प्रयास करें: dispatch_async (dispatch_get_main_queue(),^{ }); – Dobler

1

मुझे लगता है मैं Dobler रूप में एक ही समस्या थी, लेकिन मेरे समाधान अलग था।

समस्या यह है कि टाइमर एक

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{}) 

कॉल के भीतर एक ब्लॉक में बनाया है और अनुसूचित किया जा रहा था एक GCD धागा में था (वास्तव में गहरी नेस्ट, तो यह स्पष्ट नहीं था कि इस मामले था)।

NSTimer's scheduledTimerWithTimeInterval:... का उपयोग करना गलत रन लूप में टाइमर रखा।

ठीक

timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(...) userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
संबंधित मुद्दे