2009-06-25 19 views
6

मैं आईफोन पर NSUserDefaults उलझन में हूं।क्या NSUserDefaults में सामान का एक गुच्छा लगाने का कोई बेहतर तरीका है?

मैं एक सी/एएसएम पृष्ठभूमि से आया हूं और उद्देश्य-सी सामान एक सीखने का अनुभव रहा है।

मैं वर्तमान में कुछ स्ट्रिंग्स (हाईस्कॉर्क्स टेबल में नामों के लिए) स्टोर करने के लिए NSUserDefaults का उपयोग कर रहा हूं। मैं एक "सेव गेम" टाइप फीचर को कार्यान्वित करना शुरू करना चाहता हूं ताकि उपयोगकर्ता को एक पल के लिए कॉल से बाहर निकल जाए या खेल से बाहर निकल जाए, तो वे वापस आ सकते हैं।

खेल को पुनर्प्राप्त करने के लिए, मुझे कुछ BOOL झंडे मिल गए हैं, कुछ int एस कुछ आवश्यक चर स्टोर करने के लिए हैं, लेकिन मैं स्टोर करने की आवश्यकता वाले सरणी में फंस गया हूं।

मेरे पास unsigned char एस का 50 तत्व सरणी है। मैं इसे int एस पर ले जा सकता हूं अगर यह चीजों को आसान बनाता है, लेकिन मैं इसे देख नहीं रहा हूं।

NSUserDefaults के साथ काम करने के लिए मैं setBool (पहले से ही कर रही) कर सकते हैं, setFloat (फिर से, पहले से ही कर रही), setInteger, और setObject

स्पष्ट रूप से मैं सरणी के प्रत्येक तत्व के लिए कुंजी घोषित कर सकता हूं और setInteger के साथ उन्हें एक-एक करके स्टोर कर सकता हूं लेकिन यह वास्तव में क्लेडी है। इससे निपटने का सबसे अच्छा तरीका क्या है? unsigned char एस की सरणी के बजाय, मैं किसी भी तरह NSObject का उपयोग करने का प्रयास करता हूं? क्या NSObject पर कोई अच्छा ट्यूटोरियल है जिसे मैं बेहतर समझने के लिए पढ़ सकता हूं?

उत्तर

5

क्या संपत्ति सूची आप जो हासिल करने की कोशिश कर रहे हैं उसके साथ बेहतर फिट बैठेगी?

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

http://developer.apple.com/documentation/Cocoa/Conceptual/PropertyLists/...

+1

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

+0

सहमत हैं, उपयोगकर्ता डिफ़ॉल्ट है prefs, लेकिन डेटा को कहीं और संग्रहीत किया जाना चाहिए, उदाहरण के लिए "~/लाइब्रेरी/एप्लिकेशन सपोर्ट/MyApp /" में एक प्लिस्ट की तरह। –

+0

आईफोन पर, आंकड़ों को संग्रहित करने के लिए स्पष्ट रूप से अलग-अलग सम्मेलन हैं, क्योंकि संरचना बहुत अलग है। अपने ऐप के लिए फाइलों को संग्रहीत करने के विवरण के लिए प्रासंगिक आईफोन प्रोग्रामिंग गाइड से परामर्श लें। –

2

आप एक NSArray या setObject:forKey: साथ NSUserDefaults के लिए एक NSDictionary पारित कर सकते हैं। यह ठीक काम करता है। जाहिर है, आपके हस्ताक्षरित वर्णों की सरणी को का NSArray बनना होगा, जो कुछ ओवरहेड का तात्पर्य है, लेकिन यह शायद आपका सबसे आसान विकल्प है।

1

एक NSData वस्तु है, जो सीधे NSUserDefaults

[[NSUserDefaults standardUserDefaults] setObject:[NSData dataWithBytes:array length:len] 
              forKey:@"someArray"]; 
0

वहाँ वाह करने के लिए भंडारित किया जा सकता का उपयोग करके देखें, क्या तुम सच में कोर डेटा (या बस sqllite) का उपयोग कर खेल राज्य स्टोर करने के लिए ध्यान देना चाहिए। NSUserDefaults क्या कहता है - डिफ़ॉल्ट, कॉन्फ़िगरेशन सेटिंग्स के लिए है। यह वास्तव में बाइनरी डेटा के बड़े पैमाने पर हिस्सों को स्टोर करने के लिए नहीं है।

0

एक NSArray जो आपको एक NSUserDefaults में स्टोर कर सकते हैं करने के लिए अहस्ताक्षरित वर्ण की एक 50 तत्व सी सरणी परिवर्तित करने के लिए उपयोग करते हुए:

NSMutableArray* a = [NSMutableArray new]; 
for (int i = 0; i < 50; ++i) { 
    [a addObject:[NSNumber numberWithInteger:yourArray[i]]]; 
} 
[[NSUserDefaults standardUserDefaults] setObject:a forKey:@"theArray"]; 
[a release]; 

इसे वापस पाने के लिए:

NSArray* a = [[NSUserDefaults standardUserDefaults] objectForKey:@"theArray"]; 
for (int i = 0; i < 50; ++i) { 
    yourArray[i] = [[a objectAtIndex:i] integerValue]; 
} 

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

+0

कोड और सिफारिश के लिए धन्यवाद। मैं इसे एक शॉट दूंगा। – K2Digital

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