2009-11-05 4 views
6

मैं टेक्स्ट फ़ील्ड में एक एप्लिकेशन में समय (सेकंड सहित) प्रदर्शित करना चाहता हूं, बहुत सरल। मैं वर्तमान में जो करता हूं वह एक एनएसटीमर है जो प्रत्येक 0.1 सेकंड चलाता है जो सिस्टम समय प्राप्त करता है और टेक्स्ट फ़ील्ड को अपडेट करता है। यह इसे पूरा करने के लिए एक बहुत ही अक्षम तरीका लगता है। क्या कोई बेहतर तरीका है?कोको में कुशलतापूर्वक सेकंड में समय प्रदर्शित करने के लिए कैसे?

उत्तर

6

क्या आप इसे दसवीं-एक-सेकेंड (या बेहतर) रिज़ॉल्यूशन में प्रदर्शित कर रहे हैं?

यदि हां, तो मुझे कोई समस्या नहीं दिखाई दे रही है। आम तौर पर, मतदान बेकार हो जाता है क्योंकि जो भी आप जांच रहे हैं वह शायद नहीं बदला हो सकता है, लेकिन ऐसा नहीं है कि समय आपके लिए रुक जाएगा। तो दसवां-एक-दूसरा टाइमर ठीक है।

यदि नहीं, तो एक टाइमर बनाएं जिसका अंतराल वांछित रिज़ॉल्यूशन है, फिर उसकी अग्नि तिथि प्राप्त करें, इसे वांछित रिज़ॉल्यूशन पर ले जाएं (उदाहरण के लिए, यदि आप हर सेकेंड को अपडेट करते हैं तो एक दूसरा सेकेंड), और इसे नई आग के रूप में सेट करें तारीख। फिर, आपका टाइमर संयोग से ही आपके घड़ी के दृश्य को अपडेट करने के लिए उपयुक्त होगा।

ध्यान दें कि समय हमेशा चलता रहता है, यह हमेशा रैखिक रूप से नहीं चलता है: यह एक घंटे या आधे घंटे तक आगे या पीछे कूद सकता है, या उपयोगकर्ता (या एनटीपीडी) सिस्टम घड़ी सेटिंग में बदलाव करता है। मैक ओएस एक्स 10.6 और बाद में, आप NSSystemClockDidChangeNotification के लिए देख सकते हैं, और ऐसा होने पर आपके टाइमर की अग्नि तिथि को फिर से समायोजित कर सकते हैं।

+0

मैं केवल एक दूसरे रिज़ॉल्यूशन पर प्रदर्शित कर रहा हूं। लेकिन अगर मैं एक सेकंड में मतदान करता हूं, उदाहरण के लिए, मेरे टेक्स्ट अपडेट पर 9 सेकंड देर हो सकती है। यदि उपयोगकर्ता के पास मेनू बार पर उनकी घड़ी पर "डिस्प्ले सेकेंड" विकल्प सेट होता है, तो मैं चाहता हूं कि ऐप मेनू बार को सेकेंड में बदलते समय सटीक समय पर टेक्स्ट टेक्स्ट अपडेट करने के लिए दिखाई दे, इस प्रकार एक बार 10 बार मतदान कर रहा है। – rscott

+0

यदि आप आग की तारीख ठीक से सेट कर चुके हैं तो आप 0.9 सेकंड देर से नहीं होंगे। टाइमर को इसे खींचने के लिए बहुत मुश्किल लगाना होगा-और यदि यह 0.9 सेकंड से घिरा हुआ है, तो इसके अंतराल को 0.1 सेकंड में सेट करने में मदद नहीं मिल रही है। –

0

मुझे यकीन नहीं है कि और क्या अधिक कुशल होगा। जब तक आपके टाइमर के लिए कॉलबैक कुछ भी गहन नहीं कर रहा है, तो आप शायद इष्टतम के करीब हैं।

-2

gettimeofday(2) का उपयोग करने के बारे में कैसे? यह उपयोग करने के लिए बहुत सटीक समय की जानकारी देता है।

+1

हालांकि, प्रदर्शन को अद्यतन नहीं रखता है, हालांकि। वर्तमान समय प्राप्त करना कठिन हिस्सा नहीं है; यह आवधिक अद्यतन है कि प्रश्नकर्ता के बारे में सोच रहा था। साथ ही, आपका दावा है कि 'gettimeofday'' अधिक [अधिक] सटीक समय की जानकारी देता है "तुलना की कमी है: क्या अधिक सटीक है? –

2

आप एनएसटीमर का उपयोग कैसे करते हैं जो हर सेकेंड चलाता है और फिर आप फायरिंग समय की जांच करते हैं और सुनिश्चित करते हैं कि यह वास्तव में एक सेकंड की शुरुआत में है। आप उचित रूप से setFireDate: उपयोग करने के बाद टाइमर बनाया गया था initWithFireDate:interval:target:selector:userInfo:repeats: का उपयोग करें या अगले मंगलाचरण समय निर्धारित कर सकते हैं:

NSTimeInterval interval = [[timer fireDate] timeIntervalSinceReferenceDate]; 
NSTimeInterval nextFire = ceil(interval); 
[timer setFireDate: [NSDate dateWithTimeIntervalSinceReferenceDate: nextFire]; 

तो फिर तुम यह सुनिश्चित करें कि के रूप में संभव के रूप में आवश्यक समय के करीब और टाइमर आग के बारे में चिंता मत करो हो जाएगा टाइमर पीछे हट रहा है क्योंकि यह आपके द्वारा प्रदान की जाने वाली इच्छित फायरिंग तिथि और अंतराल का उपयोग करके प्रत्येक फायरिंग के बाद खुद को रीसेट करता है, इसलिए यह हमेशा सटीक दूसरे पर आग लगाने की कोशिश करेगा (लेकिन जब भी रन लूप ऐसा करने में सक्षम होगा तब आग लग जाएगी)।

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