2011-05-24 14 views
12

मेरे ऐप में एक तर्क प्रक्रिया के दौरान, मुझे उपयोगकर्ता प्राथमिकताओं को बार-बार एक्सेस करने की आवश्यकता होती है, और यह निर्धारित करने के लिए कि कितनी संसाधित की जानी चाहिए और कैसे। यह सवाल प्रदर्शन के बारे में नहीं है, लेकिन इसे सही तरीके से करने के बारे में है।एनएसयूसर डीफॉल्ट एक्सेस करना अक्सर

वर्तमान में मैं एक मूल्य का अनुरोध करने के लिए प्रत्येक बार [[NSUserDefaults standardUserDefaults] valueForKey:...] कर रहा हूं। क्या ये सही है? मुझे लगता है कि उपयोगकर्ता को "ivar" के रूप में डिफॉल्ट करने से अतिरिक्त काम कम हो सकता है, लेकिन फिर मुझे आश्चर्य है कि इसमें सिंक समस्याएं नहीं होंगी, जैसे कि उपयोगकर्ता वरीयताओं को बदलता है और वे केवल तभी अपडेट होते हैं जब ऐप पुनरारंभ होता है (इसलिए उपयोगकर्ता डिफ़ॉल्ट ऑब्जेक्ट को पुनर्निर्मित किया जाता है)।

क्या कोई बेहतर तरीका है?

+1

यदि आप करते हैं तो आपके पास सिंक समस्याएं नहीं होंगी और यदि आपके पास नहीं है तो आपके पास प्रदर्शन समस्याएं नहीं होंगी। – vakio

उत्तर

26

इसके बारे में चिंता न करें, यह बेहद तेज़ है और मुझे विश्वास नहीं है कि एक बेहतर तरीका है, इस तरह कक्षा का उपयोग किया जाना है।

एनएसयूसर डीफॉल्ट क्लास आंतरिक रूप से मूल्यों को कैश करता है ताकि लुकअप बेहद तेज़ हो। का ओवरहेड [NSUserDefaults standardUserDefaults] बनाम उदाहरण चर इतना छोटा है कि अगर आप इसे अपने कोड में 5 मिलियन बार करते हैं तो आप इसे भी नहीं देख पाएंगे।

इस अनुकूलन के अपने तर्क में सुधार के द्वारा किया जाएगा, उपयोगकर्ता चूक में मान करो शब्दकोश NSUserDefaults मूल रूप से है कि आदि

+0

मुझे विश्वास है कि आप सही हैं (कैशिंग प्रलेखन में स्पष्ट है) लेकिन आपका दावा थोड़ा चरम लगता है, इसे वापस करने के लिए कुछ भी? – Clafou

+3

@ क्लाफू मैंने जो पोस्ट किया है उसे फिर से पढ़ना मेरी टिप्पणी वास्तव में आपके प्रश्न का उत्तर नहीं दे सका, बल्कि केवल 'हां हां बेरवीव' को मजबूत किया! निहितार्थ मेरे जवाब था, इसके लिए खेद है। वैसे भी, परीक्षण ने मुझे 5 मिलियन बार साझा उदाहरण तक पहुंचने के लिए लगभग 150ms दिए। स्क्रीनी: http://cl.ly/image/3J1J0H3D2h26 http://cl.ly/image/0F3R18413H2f –

+0

क्या आवृत्ति चर का उपयोग करने के बजाय स्ट्रिंग लुकअप करने की कोई कीमत नहीं है? आपको स्ट्रिंग आवंटित करना और बनाना होगा और फिर मान को देखने के लिए इसका उपयोग करना होगा (शायद हैश तालिका के साथ)। निश्चित रूप से * यह * एक प्रदर्शन हिट बनाम एक उदाहरण चर है। – BallpointBen

4

यदि आप डिफॉल्ट ऑब्जेक्ट को ivar में सहेजते हैं तो आपको कोई समस्या नहीं होगी। ध्यान दें कि यह एक सिंगलटन है और इसका सूचक नहीं बदलेगा।

+0

मान लीजिए कि वह वरीयता के * मूल्य * को इन-मेमोरी इवर में सहेजना था, इसलिए इसे NSUserDefaults में कुंजी से लगातार पढ़ने की आवश्यकता नहीं होगी। एक 'छोटा) परिवर्तनीय नाम सहेज नहीं रहा है जैसे कि' NSUserDefaults * डिफ़ॉल्ट = [NSUserDefaults मानकUserDefaults]; '। – pkamb

2

के बजाय एक सूचक के साथ मूल्यों आप अपने आप को उपयोग कर रहे हैं कैशिंग के केवल उचित तरीके इस तर्क प्रक्रिया के दौरान समय के साथ बदलते हैं?

यदि नहीं, तो आप प्रत्येक मान को एक्सेस कर सकते हैं जिसे आपको शुरुआत में एक बार प्रक्रिया में आवश्यकता होगी और परिणामों को स्थानीय चर में स्टोर कर सकते हैं।

फिर आप उन चरों का उपयोग जितनी बार चाहें उतनी बार उपयोग कर सकते हैं जितनी बार उपयोगकर्ता डेटा को हर बार डेटा पढ़ने के बिना मारना पड़ता है।

हालांकि, यदि आपकी तर्क प्रक्रिया चल रही है, तो उन मानों को बदला जा रहा है, तो डिफ़ॉल्ट रूप से उन्हें एक्सेस करना एकमात्र तरीका है।

प्रदर्शन के संदर्भ में, इसे 10-15 बार एक्सेस करने से कोई प्रतिकूल प्रभाव नहीं पड़ेगा। यदि आप लंबे समय तक प्रति सेकंड 10-15 बार एक्सेस कर रहे थे, तो आपको कुछ प्रतिक्रियात्मक मुद्दों का सामना करना पड़ सकता है।

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

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