ios7 - NSTimer repeating too fast -


समस्या

मैं निर्माण कर रहा हूं एक ऐप जहां मुझे रियल-टाइम डेटा मिल रहा है और एक MKMapView को अपडेट किया जा रहा है। मुझे हर 10 सेकेंड में डेटा का एक बैच मिलता है और webs सेवा से डेटा सेट के बीच मैं पुराने डाटा पॉइंट को हटा रहा हूं जबकि नए लोगों को जोड़ता हूं।

उन सभी को अद्यतन करने के बजाय एक बार जब मैं उस 10 सेकंड में डेटा सेवा से प्राप्त नए बिंदुओं के एनीमेशन को फैलाना चाहता हूं तो मैं 'रीयल टाइम' महसूस करता हूं और कई स्टॉप से ​​बचता हूं शुरू हो सकता है जैसा मैं कर सकता हूं।

ऐसा लगता है कि एनएसटीइमर हमेशा शुरुआती खत्म हो रहा है ... जिस तरह से जल्दी हो। यह 10 सेकंड से नए डेटा के माध्यम से लूप होना चाहिए, लेकिन आमतौर पर यह पहले 4 से 5 सेकंड के नए डेटा सेट के माध्यम से लूपिंग को समाप्त करना चाहिए।

मैंने बहुत से एप्पल दस्तावेज़ और स्टैक ओवरफ्लो प्रश्नों के माध्यम से पढ़ा है (नीचे दिखने वाले लोगों के लिए दो अच्छे हैं):)

लेकिन ऐसा लगता है कि ज्यादातर सिफारिशें गेमिंग ऐप के लिए CADisplayLink (लेकिन मैं एक गेमिंग ऐप नहीं बना रहा हूँ) या यदि आपको एक उच्च प्रदर्शन टाइमर का उपयोग करने की आवश्यकता होती है तो इसे लगातार उपयोग नहीं किया जाना चाहिए

मेरे टाइमर को सही होने की आवश्यकता नहीं है, लेकिन अगर मैं इसे 5 .5 सेकंड के अंदर भी प्राप्त कर सकता हूं, जो मैंने देखा है कि कुछ अन्य विकल्पों के ऊपरी हिस्से को जोड़ने के बिना महान होगा।

हमेशा कोई भी विचार / कोड / या दिशाएं जो आप मुझे इंगित कर सकते हैं, काफी सराहना की जाएगी।

कोड

एक बार जब मैं नए डेटा को सरणी में एकत्र करता हूं, मैं समय अंतराल बना देता हूं और टाइमर को कोड के साथ शुरू करता हूं नीचे

  addCount = -1; टाइमरडेले = 10.0 / [टाइमर ऐडडिशंस गिनती]; DelayTimer = [NSTimer अनुसूचित टाइमर विथ टाइम अंतराल: टाइमर लक्ष्य लक्ष्य: स्वयं चयनकर्ता: @ सिलेक्टर (विलंब विधि) userInfo: शून्य दोहराता है: हाँ];  

इससे तब यह तरीका निकाल दिया जाता है जो मेरी नक्शा एनोटेशन को जोड़ने और निकालने के माध्यम से एनिमेट करता है।

  - (शून्य) delayMethod {addCount = addCount +1; यदि (ऐडकाउंट & gt; = [टाइमर ऐडडिशंस गिनती]) {[टाइमररेमोवल हटाए ऑल ऑब्जेक्ट]; [टाइमर ऐडडिशंस हटाए ऑलऑब्जेक्ट]; AddCount = -1; [देरी टीमर अमान्य]; DelayTimer = शून्य; } और {{myMap addAnnotation: [टाइमर एब्डिशन ऑब्जेक्टऐटइंडएक्स: एडकाउंट]]; [मैक मैप हटायें विवरण: [टाइमररमोवल ऑब्जेक्टऐटइंडएक्स: एडकाउंट] एनिमेटेड: हाँ]; }}  

UPDATE

मैंने जीसीडी के माध्यम से अपना टाइमर अपडेट करने की कोशिश की और अजीब क्या है कि टाइमिंग लूप हर दूसरे डाटासेट को काम करता है। फिर भी यह हर टाई में काम नहीं कर रहा है, लेकिन किसी कारण से यह प्रेषण समय या टाइमर अंतराल को रीसेट करने के लिए बाध्य होने लगता है।

<पूर्व> - (शून्य) देरीमथ {dispatch_time_t विलंब = प्रेषण_टाइम (DISPATCH_TIME_NOW, NSEC_PER_SEC * टाइमरडेले); // कब तक dispatch_after (देरी, dispatch_get_main_queue (), ^ (शून्य) {addCount = addCount +1, अगर (addCount & gt; = [timerAdditions गिनती]) {[timerRemovals removeAllObjects]; [timerAdditions removeAllObjects]; addCount = -1; // [delayTimer अमान्य]; // delayTimer = nil;} else {NSLog (@ "देरी गिनती% i निकाल दिया - additoins% लू", addCount, (अहस्ताक्षरित लंबे) [timerAdditions गिनती]); [myMap addAnnotation: [timerAdditions ObjectAtIndex: addCount]]; [मैकमैप हटानेनोटेशन: [टायररमॉवल्स ऑब्जेक्टऐटइंडएक्स: एडकाउंट] एनिमेटेड: हाँ]; [स्व विलंबमापी];}}); }

मैं टाइमर का उपयोग कर रहा हूं जैसा कि अधिक सही के लिए टाइमर आवृत्ति के साथ सामान करता है । परिणाम

  - (शून्य) createTimer {// टाइमर प्रारंभ करता है, तो (gameTimer == शून्य) gameTimer = [NSTimer timerWithTimeInterval: 1.00 लक्ष्य: स्वयं चयनकर्ता: @selector (timerFired :) userInfo: शून्य दोहराता है: हाँ]; [[NSRunLoop currentRunLoop] addTimer: gameTimer forMode: NSDefaultRunLoopMode]; टाइमकाउंट = 725; // आवृत्ति चर या आप इसे अपनी आवश्यकता के रूप में सेट कर सकते हैं} - (शून्य) टाइमरफ़ाईड: (एनएसटीिमर *) टाइमर {// अपडेट लेबल अगर (टाइमकाउंट == 0) {[स्व टाइमर एक्सक्वाइड]; } अन्य {timeCount--; अगर (टाइमकाउंट == 0) {// बटन के साथ सही संवाद प्रदर्शित करें [टाइमर अमान्य]; [आत्म घड़ी] }} // विशिष्ट समय के लिए यहां आपके सामान करें } - (शून्य) टाइमरएक्साइड {// एक चेतावनी प्रदर्शित करें या कुछ समय जब टाइमर की समय सीमा समाप्त हो जाती है एनएसएलॉग (@ "आपका समय खत्म हो चुका है"); [गेमटाइमर अमान्य]; GameTimer = शून्य; // समय के पूरा होने के लिए अपना सामान करें }  

इसमें आपको समय अंतराल चाहिए। और आप की आवश्यकता के रूप में भी वृद्धि घटते सामान। और टाइमर के साथ काम निकाल दिया और पूरा किया आपकी स्थिति में यदि आप टाइमर को ठीक से नहीं समाप्त करना चाहते हैं टाइमर के उदाहरण को कभी भी अमान्य न करें और सामान करने के लिए केवल टाइमर निकाल दिया गया ईवेंट का उपयोग करें।


Comments

Popular posts from this blog

sqlite3 - UPDATE a table from the SELECT of another one -

c# - Showing a SelectedItem's Property -

javascript - Render HTML after each iteration in loop -