2011-08-14 27 views
48

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

मैं यह जोड़ना चाहता हूं कि इन स्ट्रिंग मानों को उपयोगकर्ता द्वारा जोड़ा/हटा दिया जाएगा।

उत्तर

82

मैं एक सरणी मान रहा हूं, लेकिन यह शब्दकोशों के साथ भी काम करेगा।

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

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

NSUserDefaults:

हालांकि यह सिर्फ उपयोगकर्ता सेटिंग रखने की अपेक्षा की जाती है यह बहुत तेजी से और आसान है। userdefaults करने के लिए उन्हें लिखने के लिए:

NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil]; 
[[NSUserDefaults standardUserDefaults] setObject:stringsArray forKey:@"MyStrings"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

userdefaults से पढ़ने के लिए:

NSArray *stringsArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyStrings"]; 

Plist:

अपने तार संशोधित किया जा करने के लिए आप लिखने के लिए की आवश्यकता होगी जा रहे हैं और एक प्लेस्ट पढ़ें लेकिन आप अपने ऐप के संसाधनों में लिख नहीं सकते हैं।

  1. पढ़ने/लिखने plist पहले दस्तावेजों निर्देशिका

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"]; 
    
  2. सरणी बनाएँ (मैं यह सोचते हैं रहा तार, string1 रहे हैं ...)

    NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil]; 
    
  3. पाते हैं करवाने के लिए

    इसे

    [stringsArray writeToFile:stringsPlistPath atomically:YES]; 
    
  4. फ़ाइल करने के लिए लिखें

    1. दस्तावेजों निर्देशिका

      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"]; 
      
    2. में इसे पढ़ें खोजें:: 210

    plist पढ़ने के लिए

    NSArray *stringsArray = [NSArray arrayWithContentsOfFile:stringsPlistPath]; 
    
+1

मैंने हाल ही में उपयोग किए गए यूआरएल की सूची के लिए प्लिस्ट समाधान लागू किया। ऐसा लगता है कि मेरी समस्या के लिए प्लिस्ट सही दृष्टिकोण था। लेकिन मुझे यह कहना है कि एंड्रॉइड पर ऐसा करने के बाद, यह आश्चर्यजनक रूप से एक सीखने की अवस्था और समग्र प्रयास के रूप में कहीं अधिक शामिल था। तो मुझे उपरोक्त उदाहरण कोड के लिए बहुत कुछ टिप्पणी करना और कहना है ... – user574771

+2

प्रश्न ... जब आप कहते हैं कि "आप अपने ऐप्स संसाधनों में नहीं लिख सकते हैं" तो क्या आपका मतलब है कि हम एक प्लेलिस्ट को नहीं लिख सकते हैं हम xcode के भीतर से बनाते हैं और पॉप्युलेट करते हैं? – crazyCoder

+1

आप केवल अपने ऐप की दस्तावेज़ निर्देशिका में लिख सकते हैं। तो आप उस प्लिस्ट को संसाधन निर्देशिका से रनटाइम पर दस्तावेज़ निर्देशिका में कॉपी कर सकते हैं और फिर इसे संपादित कर सकते हैं। – doppioslash

1

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

+1

क्यों कोर डाटा तार के एक मुट्ठी भर के लिए एक plist के लिए बेहतर होगा? – jlehr

+0

क्योंकि तब ढांचा फाइल विवरण, सिंक्रनाइज़ेशन और त्रुटि प्रबंधन जैसे सभी विवरणों का ख्याल रखेगा। –

+0

@MarcusKarlsson NSUserDefaults ओपी के लिए यह हैंडलिंग भी प्रदान करेगा। ओपी सूचियों के तारों की छोटी संख्या मुझे उपयोगकर्ता वरीयता के बराबर समझाती है, हालांकि अधिक जानकारी यहां मार्गदर्शन करने में सहायक होगी। –

2

यह इस बात पर निर्भर करता है कि आप क्या स्टोर करना चाहते हैं और क्यों। NSUserDefaults उपयोगकर्ता वरीयताओं को संग्रहीत करने के लिए है। आप इसे अन्य चीजों के लिए उपयोग करने का प्रयास कर सकते हैं, लेकिन आपको शायद नहीं करना चाहिए।

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

7

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

NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"MyStrings" withExtension:@"plist"]; 
NSArray *stringArray = [NSArray arrayWithContentsOfURL:plistURL]; 
4

NSUserDefaults पुस्तकालय/प्राथमिकताएं फ़ोल्डर में एक फ़ाइल में उपयोगकर्ता वरीयताओं को स्टोर होगा। सिद्धांत रूप में यह केवल कुछ एप्लिकेशन/उपयोगकर्ता गुणों को स्टोर करने के लिए कार्य करता है।

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

2

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

// Make a path to the plist in the Documents directory 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *stringsPlistPathIndDoc = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"]; 

// Make a path to the plist in your app's Bundle directory 
NSString *stringsPlistPathInBundle = [[NSBundle mainBundle] pathForResource:@"Strings" ofType:@".plist"]; 

NSFileManager *fileManager = [NSFileManager defaultManager]; 

// Check first that you haven't already copied this plist to the Documents directory 
if (![fileManager fileExistsAtPath:stringsPlistPathIndDoc]) 
{ 
    NSError *error; 

    // Copy the plist from the Bundle directory to the Documents directory 
    [fileManager copyItemAtPath:stringsPlistPathInBundle toPath:stringsPlistPathIndDoc error:&error]; 
} 

// Write your array out to the plist in the Documents directory 
NSMutableArray *stringsArray = [[NSMutableArray alloc] initWithObjects:@"string1", @"string2", @"string3", nil]; 
[stringsArray writeToFile:stringsPlistPathIndDoc atomically:YES]; 

// Later if you want to read it: 
stringsArray = [[NSMutableArray alloc] initWithContentsOfFile:stringsPlistPathIndDoc]; 
7

आईओएस अंततः सभी NSUserDefaults डेटा को एक प्लेलिस्ट फ़ाइल में संग्रहीत करता है। इसलिए यदि यह आपकी चिंता है तो यह प्रदर्शन को प्रभावित नहीं करेगा। मैं व्यक्तिगत रूप से डेटा के अपेक्षाकृत बड़े सेट के लिए छोटे डेटा और प्लिस्ट के लिए NSUserDefaults का उपयोग करना पसंद करता हूं।

नोट: किसी भी संवेदनशील जानकारी को NSUserDefaults में कभी भी स्टोर न करें क्योंकि कोई भी डेटा देख सकता है।

1

.plist

  1. एक plist Xcode

का उपयोग कर एक मूल्य plist को

NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"settings" withExtension:@"plist"]; 

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfURL:plistURL]; 
[dict setValue:@"value" forKey:@"key"]; 
[dict writeToURL:plistURL atomically:YES]; 

plist

से एक मूल्य पढ़ें का उपयोग बनाएं लिखें
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfURL:plistURL]; 
NSString *myValue = [dict valueForKey:@"key"]; 
2

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

अधिकतर, लोग कुछ की सूची स्टोर करना चाहते हैं, इसलिए एनएस डिक्शनरी के साथ ऐसा करने के तरीके पर मेरा हिस्सा यहां है।यह स्विफ्ट 2,0

पहले एक plist फ़ाइल बनाने के लिए आप की आवश्यकता नहीं है, यह पहली बार सहेजते समय कुछ

xcode 7 बीटा पर बनाया जाएगा,

func SaveItemFavorites(items : Array<ItemFavorite>) -> Bool 
{ 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let docuDir = paths.firstObject as! String 
    let path = docuDir.stringByAppendingPathComponent(ItemFavoritesFilePath) 
    let filemanager = NSFileManager.defaultManager() 

    let array = NSMutableArray()   

    for var i = 0 ; i < items.count ; i++ 
    { 
     let dict = NSMutableDictionary() 
     let ItemCode = items[i].ItemCode as NSString 

     dict.setObject(ItemCode, forKey: "ItemCode") 
     //add any aditional.. 
     array[i] = dict 
    } 

    let favoritesDictionary = NSDictionary(object: array, forKey: "favorites") 
    //check if file exists 
    if(!filemanager.fileExistsAtPath(path)) 
    { 
     let created = filemanager.createFileAtPath(path, contents: nil, attributes: nil) 
     if(created) 
     { 
      let succeeded = favoritesDictionary.writeToFile(path, atomically: true) 
      return succeeded 
     } 
     return false 
    } 
    else 
    { 
     let succeeded = notificationDictionary.writeToFile(path, atomically: true) 
     return succeeded 
    } 
} 

लिटिल टिप्पणी बचत दस्तावेज़ों से:

NSDictionary.writeToFile (पथ: परमाणु रूप से :)

इस विधि रिकर्सिवली मान्य करता है कि सभी निहित वस्तुओं संपत्ति सूची वस्तुओं (NSData के उदाहरण, NSDate, NSNumber, NSString, NSArray, या NSDictionary) फ़ाइल बाहर लिखने से पहले, और रिटर्न नहीं करता है, तो सभी वस्तुओं संपत्ति नहीं हैं ऑब्जेक्ट्स सूचीबद्ध करें, क्योंकि परिणामी फ़ाइल वैध संपत्ति सूची नहीं होगी।

तो जो भी आप dict.SetObject() पर सेट करते हैं, ऊपर उल्लिखित प्रकारों में से एक होना चाहिए।

लोड हो रहा है

private let ItemFavoritesFilePath = "ItemFavorites.plist" 

func LoadItemFavorites() -> Array<ItemFavorite> 
{ 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let docuDir = paths.firstObject as! String 
    let path = docuDir.stringByAppendingPathComponent(ItemFavoritesFilePath) 
    let dict = NSDictionary(contentsOfFile: path) 
    let dictitems : AnyObject? = dict?.objectForKey("favorites") 

    var favoriteItemsList = Array<ItemFavorite>() 

    if let arrayitems = dictitems as? NSArray 
    { 
     for var i = 0;i<arrayitems.count;i++ 
     { 
      if let itemDict = arrayitems[i] as? NSDictionary 
      { 
       let ItemCode = itemDict.objectForKey("ItemCode") as? String 
       //get any additional 

       let ItemFavorite = ItemFavorite(item: ItemCode) 
       favoriteItemsList.append(ItemFavorite) 
      } 
     } 
    } 

    return favoriteItemsList 
} 

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

  • कोई संबंधित समस्या नहीं^_^