2011-04-02 7 views
23

दुरुपयोग मुझे आश्चर्य है कि क्या दिशा निर्देश हैं के लिए:
1 - कितनी बार मैं NSUserDefaults से पढ़ सकते हैं
2 - कितना डेटा मैं यथोचित जाहिर NSUserDefaultsजब (नहीं) NSUserDefaults

में स्टोर कर सकते हैं

, देखते हैं एनएसयूसर डीफॉल्ट का कितना उपयोग किया जा सकता है, लेकिन मुझे यह निर्धारित करने में परेशानी है कि क्या उचित है और क्या नहीं है।

अन्य लोगों के अलावा कुछ उदाहरण:

  • मेरे खेल के लिए कंप्यूटर खिलाड़ियों में से एक के लिए एक विकल्प है, मुझे NSUserDefaults कि बूलियन मान बचाने के लिए प्रयोग करेंगे। इतना स्पष्ट है। लेकिन क्या हर बार जब मैं जानना चाहता हूं कि कंप्यूटर एक खिलाड़ी है या नहीं, तो इसके बजाय एनएसयूसर डीफॉल्ट को अपने गेम के दौरान एक्सेस करना उचित है या नहीं? मान लीजिए मुझे हर बूब उस बूलियन की जांच करने की ज़रूरत है। क्या इसका जवाब यह है कि यह 100 एमएस है? हर 10 एस के बारे में क्या?

  • यदि मेरे गेम में 50 चलती ऑब्जेक्ट्स हैं और मैं चाहता हूं कि उपयोगकर्ता अपनी स्थिति और गति को स्टोर करने के लिए संग्रहीत करे, तो क्या उपयोगकर्ता उस डेटा को स्टोर करने के लिए एक उचित स्थान है? 20 चलती वस्तुओं के बारे में क्या? 200 के बारे में क्या?

उत्तर

13

सीमाओं के बारे में चिंता न करें। इसके बजाय, अपने आप से यह सरल प्रश्न पूछें:

क्या यह वरीयता है?

यदि यह प्राथमिकता है, तो यह उपयोगकर्ता डिफ़ॉल्ट में होना चाहिए। यही उपयोगकर्ता के लिए डिफ़ॉल्ट है। यदि नहीं, तो यह दस्तावेज़ निर्देशिका में होना चाहिए (या, मैक पर, संभवतः एप्लिकेशन समर्थन में)।

आईओएस पर, आप यह बता सकते हैं कि यह उचित है या नहीं, यह उचित होगा (यदि संभव हो) सेटिंग सेटिंग्स में प्रदर्शन और संपादन के लिए इसे अपनी सेटिंग्स बंडल में डाल दें। मैक ओएस एक्स पर, आप आमतौर पर बता सकते हैं कि यह प्राथमिकता है या नहीं, यह प्राथमिकता विंडो में रखना उचित होगा या नहीं।

बेशक, यह आपके फैसले पर निर्भर करता है। मैक के लिए स्टांजा, उदाहरण के लिए, इसे गलत मानता है, इसकी प्राथमिकता विंडो में गैर प्राथमिकताएं डालता है।

तुम भी अपनी बातचीत से सवाल करने पर विचार कर सकते हैं:

इस उपयोगकर्ता द्वारा बनाए गए डेटा है?

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

+0

प्रतिक्रियाओं के लिए सभी को धन्यवाद। इससे काफी मदद मिली। – double07

7

आइटम के हजारों के लिए सैकड़ों NSUserDefaults में ठीक कर रहे हैं (यह मूल रूप से संपत्ति सूची क्रमबद्धता चारों ओर सिर्फ एक आवरण है)। अपने आवेदन के लिए ओवरहेड के संबंध में, सबसे अच्छी बात यह है कि इसे आजमाएं और प्रोफाइलर का उपयोग करें।

+2

एक प्रोफाइलर के उपयोग का उल्लेख करने के लिए धन्यवाद। आप मेरे हीरो हैं। –

16

मुझे आश्चर्य है कि क्या दिशानिर्देश हैं: 1 - कितनी बार मैं NSUserDefaults

से काफी नियमित रूप से पढ़ सकते हैं। उम्मीद चूक 'भूमि के ऊपर एक धागा सुरक्षित NSDictionary

2 के समान होने की - कितना डेटा मैं यथोचित शारीरिक रूप से NSUserDefaults

में स्टोर कर सकते हैं

, अधिक से अधिक आप इसे की आवश्यकता होगी। तार्किक अधिकतम यह है कि आपको कितनी तेज़ी से यह होना चाहिए, और डिस्क पर कितनी जगह लगती है। यह भी याद रखें कि यह प्रतिनिधित्व स्टार्टअप/शट डाउन और कई अन्य बार डिस्क पर/से लिखा गया है।

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

प्रतिद्वंद्वी ऑब्जेक्ट में केवल const bool जोड़ें। शून्य रनटाइम हानि, स्मृति के अलावा, जो महत्वपूर्ण नहीं होगा।

मान लें कि मुझे हर दूसरे उस बुलियन की जांच करने की आवश्यकता है। क्या इसका जवाब यह है कि यह 100 एमएस है? हर 10 एस के बारे में क्या?

फिर से, यह थ्रेड-सुरक्षित NSDictionary (हैशिंग) की तरह है। यह काफी तेज़ होगा, और उस आवृत्ति पर पढ़ने के लिए पर्याप्त तेज़ होगा। चाहे यह सबसे अच्छा डिजाइन है या नहीं, कार्यक्रम पर निर्भर करता है।अगर यह बड़ा हो जाता है, तो हाँ प्रदर्शन भुगतना होगा।

यदि मेरे गेम में 50 चलती ऑब्जेक्ट्स हैं और मैं चाहता हूं कि उपयोगकर्ता अपनी स्थिति और गति को स्टोर करने के लिए संग्रहीत करे, तो क्या उपयोगकर्ता उस डेटा को स्टोर करने के लिए एक उचित स्थान है? 20 चलती वस्तुओं के बारे में क्या? 200 के बारे में क्या?

यह ठीक है, हालांकि मैं खेल-प्ले के दौरान उपयोगकर्ता चूक के माध्यम से पढ़ने/लिखने नहीं होगा हो सकता है; बस आवश्यकतानुसार राज्य को बचाएं/लोड करें।

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

+0

अपने अंतिम पैराग्राफ के संबंध में, डिस्क में प्रत्येक 1 से 5 बार डिस्क में फ्लश करें, या हर मिनट ऐसा करने के लिए टाइमर का उपयोग करें। –

10

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

उस ने कहा, NSUserDefaults एक मेमोरी कैश का उपयोग करता है, और सिंक्रनाइज़ करने पर लागत केवल तभी होती है। दस्तावेज़ीकरण के अनुसार, सिंक्रनाइज़ेशन होता है "स्वचालित रूप से ... आवधिक अंतराल पर"; मेरा मानना ​​है कि यह केवल तभी लागू होता है जब कुछ बदल गया हो।

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

2

NSUserDefaults मूल रूप से डिस्क से एक .plist फ़ाइल से एक NSDictionary लोड करने के लिए एक रैपर है (और इसे डिस्क पर भी लिख रहा है)। आप NSUserDefaults में जितना अधिक डेटा स्टोर कर सकते हैं, लेकिन आपके पास इसका कितना मेमोरी उपयोग होता है, और डिस्क से यह कैसे पढ़ता है पर आपका बहुत कम नियंत्रण होता है।

मैं विभिन्न जानकारी/डेटा के लिए विभिन्न तकनीकों का उपयोग करूंगा।

  • सर्वर, प्राथमिकताएं, उपयोगकर्ता की जानकारी, वगैरह से डेटा के छोटे टुकड़े, मैं NSUserDefaults का प्रयोग करेंगे।

  • लॉगिन जानकारी के लिए (टोकन, संवेदनशील डेटा तक पहुंच), मैं कीचेन का उपयोग करूंगा। कीचेन का उपयोग डेटा के लिए भी किया जा सकता है जिसे ऐप हटा दिए जाने पर हटाया नहीं जाना चाहिए।

  • बड़ी मात्रा में सर्वर डेटा या गेम डेटा के लिए, मैं इसे डिस्क पर लिखूंगा, लेकिन इसे स्मृति में रखूंगा।

अपनी स्थिति में, मैं स्मृति (शायद एक @property) में रखने होगा, लेकिन मैं समय-समय पर डिस्क (शायद हर 1 से 5 गुना बदल जाता है, किसी पूर्णांक इवर का उपयोग करें) करने के लिए इसे लिखेंगे। सुनिश्चित करें कि यह डिस्क लेखन विधि AppDelegate में है, ताकि जब आप इसे निष्पादित कर रहे नियंत्रक को बंद कर दें तो यह विफल नहीं होगा।

इस तरह, डेटा आसानी से पहुंचा जा सकता है, लेकिन यह सुरक्षित रखने के लिए डिस्क पर भी सहेजा गया है।

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