2013-07-11 13 views
6

मेरे आवेदन में, मैं उस तारीख को संग्रहीत करना चाहता हूं जिस पर ऐप पहली बार शुरू हुआ था।
मैं आवेदन में निम्नलिखित कोड का उपयोग कर रहा: didFinishLaunchingWithOptions विधि
आईओएस - NSUserDefaults में NSDate को स्टोर करने में सक्षम नहीं

NSDate* today = [NSDate date]; 
[[NSUserDefaults standardUserDefaults] registerDefaults: @{@"CONSCIENCE_START_DATE" : today}]; 

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"CONSCIENCE_START_DATE"]); 

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

मैंने सिम्युलेटर को रीसेट करने की कोशिश की और कोड फिर से चलाया। अभी भी कोई सफलता नहीं है। क्या कोई मुझे मेरे कोड में त्रुटि बता सकता है?

+1

क्या आप [सिंक्रनाइज़ करना डिफ़ॉल्ट] को भूलना नहीं चाहते हैं; ? –

+1

यदि आप ऐप लॉन्च करते समय हर बार डेट सेट करते हैं, तो आप वर्तमान तारीख से कुछ भी अलग क्यों देखने की उम्मीद करते हैं? – rmaddy

+0

@rmaddy, क्षमा करें, मैंने अपना कोड अपडेट किया – Satyam

उत्तर

14

अपने लक्ष्य बहुत पहले समय के एक उपयोगकर्ता ने आपके ऐप शुरू होता है का ट्रैक रखने के है के बाद से, आप application:didFinishLaunchingWithOptions में कुछ इस तरह की जरूरत है:

NSDate *date = [[NSUserDefaults standardUserDefaults] objectForKey:@"CONSCIENCE_START_DATE"]; 
if (!date) { 
    // This is the 1st run of the app 
    date = [NSDate date]; 
    [[NSUserDefaults standardUserDefaults] setObject:date forKey:@"CONSCIENCE_START_DATE"]; // Save date 
} 

NSLog(@"First run was %@", date); 
+0

से पूछ रहा था क्योंकि रजिस्टर डिफॉल्ट को केवल ऐप की अगली शुरुआत से ही पहली बार कॉल किया जाएगा, क्योंकि डिफ़ॉल्ट पहले से सेट हैं, यह फिर से डिफ़ॉल्ट सेट नहीं करेगा। NSUserDefaults से डेटा को स्थायी रूप से संग्रहीत करने की उम्मीद है। यही है ना – Satyam

+3

नहीं, हर बार जब आप इसे कॉल करते हैं तो 'रजिस्टर डिफॉल्ट' कहा जाता है। 'रजिस्टर डिफॉल्ट' कुछ भी नहीं लिखता है। यह केवल एक मूल्य प्रदान करता है यदि कोई मूल्य पुनर्प्राप्त करने के लिए कॉल अन्यथा 'शून्य 'वापस कर देगा। इस मामले में, 'रजिस्टर डिफॉल्ट' का उपयोग करने से कोई मतलब नहीं आता है। – rmaddy

+1

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। – Satyam

5

मूल्य निर्धारित करने के बाद आपको [[NSUserDefaults standardDefaults] synchronize] पर कॉल करने की आवश्यकता है।

Apple Docs से:

रनटाइम पर, आप एक NSUserDefaults वस्तु का उपयोग चूक कि आपके आवेदन एक उपयोगकर्ता के चूक डेटाबेस से उपयोग करता है पढ़ने के लिए। NSUserDefaults प्रत्येक बार जब आपको डिफ़ॉल्ट मान की आवश्यकता होती है तो उपयोगकर्ता के डिफ़ॉल्ट डेटाबेस को खोलने से बचने के लिए जानकारी को कैश करता है। सिंक्रनाइज़ विधि, जो स्वचालित रूप से आवधिक अंतरालों पर उत्पन्न होता है,

एक उपयोगकर्ता के चूक डेटाबेस के साथ सिंक में में स्मृति कैश रहता है।

+0

आपका अपडेट मेरे बिंदु को साबित करता है। ओएस स्वचालित रूप से आपके लिए उपयोगकर्ता डिफ़ॉल्ट सिंक्रनाइज़ करेगा। – rmaddy

+0

पूरी तरह से समझ में नहीं आया कि वह –

-1

आप की दुकान और इस तरह से

वर में पुनः प्राप्त कर सकते हैं स्टार्टडेट: एनएसडीएट? {

get { 
     return NSUserDefaults.standardUserDefaults().objectForKey(BCGConstants.UserDefaultsKey.startDateKey) as? NSDate 
    } 

    set { 
     NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: BCGConstants.UserDefaultsKey.startDateKey) 
     NSUserDefaults.standardUserDefaults().synchronize() 
    } 
} 
संबंधित मुद्दे