2009-03-27 8 views
8

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

+1

तुम्हारा मतलब है जब घड़ी में परिवर्तन, जैसे एनटीपी सिंक द्वारा, या समय क्षेत्र को बदलना या सिस्टम प्राथमिकताओं में मैन्युअल रूप से समय निर्धारित करना? –

+0

हां, यही मेरा मतलब है। मुझे खेद है कि मैं शुरू करने के लिए बहुत स्पष्ट नहीं था। मैंने आशा की है कि अब यह स्पष्ट हो गया है। –

उत्तर

13

ऐप्पल में जोड़ा गया एनएसटी सिस्टमक्लॉकडिड चेंज नॉटिफिकेशन, एनएसडीएटी का हिस्सा, हिम तेंदुए (10.6) में। तेंदुए (10.5) या उससे पहले में ऐसा करने का कोई तरीका नहीं दिखता है। Apple NSDate docs प्रति:

जब भी सिस्टम घड़ी बदल जाती है पोस्ट किया गया। इसे settimeofday() या दिनांक और समय वरीयता पैनल में उपयोगकर्ता बदलते मानों के लिए कॉल द्वारा शुरू किया जा सकता है। अधिसूचना वस्तु शून्य है। इस अधिसूचना में userInfo शब्दकोश नहीं है।

यह आपको यह नहीं बताता कि "कितना समय" बदल गया है। आप संभावित रूप से गणना कर सकते हैं (कहें, एनएसटीमर में हर 5 सेकंड) सिस्टम समय को [NSDate तिथि] के साथ कैप्चर करते हुए, इसे एक चर में सहेजते हैं, और फिर NSSystemClockDidChangeNotification आग के बाद, नई तारीख को पकड़ें और NSDate का उपयोग करके दोनों की तुलना करें समय अंतराल सेन्सडेट: अंतर प्राप्त करने के लिए विधि।

मिलीसेकंड या यहां तक ​​कि दूसरा सटीक नहीं, लेकिन बहुत करीब है।

संपादित करें:this post देखें। आप संभवतः UpTime() सी कमांड का उपयोग CPU टिक्स में सिस्टम अपटाइम को पकड़ने के लिए कर सकते हैं (जिसे आप बाद में सेकंड में परिवर्तित कर सकते हैं)। आप यह पता लगाने के लिए इसका उपयोग कर सकते हैं कि कितना समय बदल गया है (मानते हैं कि कोई सिस्टम पुनरारंभ या नींद नहीं है)। यह तब भी काम करता है जब सिस्टम घड़ी उपयोगकर्ता या नेटवर्क समय प्रोटोकॉल द्वारा बदल जाती है।

1

समय लगातार चलता है। प्रत्येक बार जब वर्तमान समय बदल जाता है तो एक अधिसूचना निरंतर, अधिसूचनाओं की सीपीयू-भिगोने वाली धारा होगी।

आपको अपने ईवेंट हैंडलर में वर्तमान समय प्राप्त करने के लिए क्या करना है- वह व्यक्ति जो आपको प्राप्त करने वाली घटनाओं को प्राप्त करता है। आपको [NSDate date] पर कॉल करके वर्तमान समय मिलता है।

+8

अच्छा, यह स्पष्ट नहीं है कि ओपी का मतलब समय का असामान्य परिवर्तन है और घड़ी की नियमित प्रगति नहीं है :) – phlebotinum

0

मुझे नहीं लगता कि ऐसा करने का एकमात्र तरीका है क्योंकि विभिन्न तंत्रों के कारण समय बदल सकता है। लेकिन यह बहुत महंगा नहीं होगा (बहुत महंगा? पता नहीं, क्या आपने इसे अभी तक प्रोफाइल किया है? ;-) NSTimer को समय की जांच करने और पिछले मान के साथ तुलना करने के लिए एक बार एक बार सेट करने के लिए। यदि यह लगभग एक सेकंड तक उन्नत नहीं है, तो कुछ दिलचस्प हुआ और आप अपने ऑडिट ऑब्जेक्ट को सूचित कर सकते हैं।

10

पर समाधान की तलाश में है कुछ पता प्रणाली की तारीख बदलने के परिवर्तन घटना तो से 10,4


OSStatus DateChangeEventHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) 
{ 
    NSLog(@"Event received!\n");  
    return 0; 
} 


- (void)SystemTimeChangeHandler 
{ 
    EventTypeSpec eventType; 
    eventType.eventClass = kEventClassSystem; 
    eventType.eventKind = kEventSystemTimeDateChanged; 

    EventHandlerUPP eventHandlerUPP = 
    NewEventHandlerUPP(DateChangeEventHandler); 
    EventHandlerRef eventHandlerRef = NULL; 
    (void)InstallApplicationEventHandler(
             eventHandlerUPP, 
             1, 
             &eventType, 
             self, 
             &eventHandlerRef); 

} 

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

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