Должен ли я использовать NSUserDefaults или plist для хранения данных? - PullRequest
51 голосов
/ 14 августа 2011

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

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

Ответы [ 9 ]

84 голосов
/ 15 августа 2011

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

Пользовательские ошибки, Базовые данные и списки могут быть прочитаны / записаны, но если вы используете список, вам нужно обратить внимание на то, что вам нужно.положи это.См. Часть списка ниже.

Базовые данные Я думаю, что это слишком много, это просто строки.Он должен использоваться, если вы хотите сохранить более сложные объекты.

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. Чтобы получить список для чтения / записи, сначала найдите каталог документов

    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];
    

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

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

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

    NSArray *stringsArray = [NSArray arrayWithContentsOfFile:stringsPlistPath];
    
8 голосов
/ 09 марта 2015

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

Примечание: Никогда не храните конфиденциальную информацию в NSUserDefaults, поскольку эти данные могут видеть все.

8 голосов
/ 14 августа 2011

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

NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"MyStrings" withExtension:@"plist"];
NSArray *stringArray = [NSArray arrayWithContentsOfURL:plistURL];
5 голосов
/ 14 августа 2011

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

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

2 голосов
/ 13 июля 2015

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

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

xcode 7 beta, 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
}
2 голосов
/ 06 июля 2015

Использование .plist

  1. Создать список с помощью 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 голосов
/ 06 декабря 2014

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

// 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];
2 голосов
/ 14 августа 2011

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

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

1 голос
/ 14 августа 2011

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

...