2011-08-14 6 views
48

Я буду хранить несколько строк (может быть, 10-20). Я не уверен, что я должен использовать NSUserDefaults для их сохранения или записать их на plist. Что считается лучшей практикой? NSUserDefaults похоже, что это меньше строк кода, поэтому быстрее реализовать.Должен ли я использовать NSUserDefaults или plist для хранения данных?

Я хотел бы добавить, что эти строковые значения будут добавлены/удалены пользователем.

ответ

82

Я принимаю массив, но он также будет работать со словарями.

Userdefaults, Core Data и Plists могут быть прочитаны и записаны, но если вы используете plist, вам нужно обратить внимание на то, что вы положили. См. Деталь 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:

Если ваши строки будут изменены вам нужно будет написать и читайте 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]; 
    

Чтобы прочитать PLIST:

  1. Найти каталог документов

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"]; 
    
  2. Читать его в:

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

Я реализовал решение PList для списка недавно использованных URL-адресов. Кажется, что PList был правильным подходом к моей проблеме. Но я должен сказать, что после того, как он сделал то же самое на Android, это было удивительно гораздо больше связано с кривой обучения и общим усилием. Поэтому я должен прокомментировать и сказать спасибо за пример кода выше ... – user574771

+2

Вопрос ... когда вы говорите «вы не можете писать в свои ресурсы приложений», вы имеете в виду, что мы не можем писать на plist, мы создаем и заполняем изнутри xcode? – crazyCoder

+1

Вы можете писать только в папке «Документы» вашего приложения. Таким образом, вы можете скопировать этот слой из каталога «Ресурсы» в каталог «Документы» во время выполнения, а затем отредактировать его. – doppioslash

1

Рекомендуемый способ сохранения данных, таких как использование данных ядра. Хотя NSUserDefaults можно использовать для хранения более или менее того, что только предполагается использовать для хранения предпочтений.

+1

Почему основные данные будут предпочтительнее PLIST для нескольких строк? – jlehr

+0

Потому что тогда структура позаботится обо всех деталях, таких как обработка файлов, синхронизация и обработка ошибок. –

+0

@MarcusKarlsson NSUserDefaults также обеспечит эту обработку для OP. Небольшое количество строк в списках OP кажется мне более похожим на предпочтения пользователей, хотя больше информации было бы полезно для руководства здесь. –

2

Это зависит от того, что вы хотите сохранить и почему. NSUserDefaults предназначен для хранения пользовательских настроек. Вы можете попробовать использовать его для других вещей, но вы, вероятно, не должны.

В противном случае, если ваши потребности просты, файл с plist довольно прост. Вы также можете использовать основные данные или создать собственный формат файла. В общем, я использую plist для простых задач, а затем перехожу к основным данным для чего-то более сложного.

7

Если вы храните 10-20 строк и ищете не слишком много строк кода, то основные данные, безусловно, слишком много накладных расходов. Я рекомендую пойти с plist. Не много кода:

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

NSUserDefaults сохранит пользовательские настройки в файле в папку Library/Preferences. Теоретически он служит только для хранения некоторых свойств приложения/пользователя.

Файл Plist полезен для управления одним файлом. Если вам нужно больше управлять, вы должны использовать Coredata. Нет ограничений на размер файла plist. В противном случае вы должны быть осторожны с файлом plist, потому что, когда вам нужно сохранить или прочитать его, все содержимое файла будет загружаться в память.

2

Использование PLIST является хорошим выбором для хранения строк, если строки а не только пользовательские настройки, которые можно использовать в NSUserDefaults. Как уже упоминалось, при использовании plist вы должны сохранить свой plist в каталоге Documents, чтобы написать ему, потому что вы не можете писать в свои ресурсы своего приложения. Когда я впервые узнал об этом, я не совсем понял, где находится каталог Bundle вашего собственного приложения, где находится каталог «Документы», поэтому я подумал, что отправлю здесь пример кода, который сначала копирует plist под названием «Strings.plist» (это вы уже имеете в своем каталоге Bundle вашего собственного приложения) в каталог «Документы», а затем записывается на него и читает его.

// 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

iOS в конечном счете хранит все данные NSUserDefaults в файл plist. Таким образом, это не повлияет на производительность, если это вас беспокоит. Я лично предпочитаю использовать NSUserDefaults для небольших данных и plist для относительно большого набора данных.

Примечание: Никогда не храните конфиденциальную информацию в 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]; 

Чтение значения из списка свойств

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfURL:plistURL]; 
NSString *myValue = [dict valueForKey:@"key"]; 
2

NSUSerDefaults действительно быстро реализовать, но в основном, как растет ваше приложение, вы хотите сохранить все больше и больше, я пошел прямо на Plist файлов.

В основном, люди хотят сохранить список чего-то, поэтому вот моя доля о том, как это сделать с NSDictionary.Это не требует, чтобы создать файл Plist первым, он будет создан в первой экономии времени что-то

Xcode 7 бета, Swift 2,0

экономии

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) перед записью из файла, и возвращает NO, если все объекты не являются собственностью поскольку результирующий файл не будет действительным списком свойств.

Так что все, что вы установили в 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 
} 
Смежные вопросы