Хобрук: Ваш путь к мастерству в программировании

Должен ли я использовать NSUserDefaults или plist для хранения данных?

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

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


Ответы:


1

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

Userdefaults, Core Data и Plists могут быть прочитаны / записаны, но если вы используете plist, вам нужно обратить внимание на то, в какой каталог вы его поместили. См. Часть списка ниже.

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

NSUserDefaults:

Это довольно быстро и легко сделать, хотя предполагается, что в нем хранятся только пользовательские настройки. Чтобы записать их в userdefaults:

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

Чтобы прочитать из пользовательских значений по умолчанию:

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

Plist:

Если ваши строки будут изменены, вам нужно будет написать и прочитать список, но вы не можете писать в ресурсы своего приложения.

  1. Чтобы иметь список для чтения / записи, сначала найдите каталог документов

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
    
  2. Создайте массив (я предполагаю, что строки - это строка1, ...)

    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];
    
14.08.2011
  • Я реализовал решение PList для списка недавно использованных URL-адресов. Кажется, PList был правильным решением моей проблемы. Но я должен сказать, что после того, как я проделал то же самое на Android, это было на удивление гораздо более сложным с точки зрения кривой обучения и общих усилий. Поэтому я должен прокомментировать и сказать большое спасибо за приведенный выше пример кода ... 15.08.2012
  • Вопрос ... когда вы говорите, что не можете писать в ресурсы своего приложения, вы имеете в виду, что мы не можем писать в список, который мы создаем и заполняем из xcode? 27.06.2014
  • Вы можете писать только в каталоге Documents вашего приложения. Таким образом, вы можете скопировать этот список из каталога ресурсов в каталог документов во время выполнения, а затем отредактировать его. 30.06.2014
  • Я хочу добавить список URL-адресов, которые будут использоваться в моем приложении. Plist - безопасный вариант для этого? Я не хочу, чтобы мой UR был сбит 25.03.2017

  • 2

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

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

    3

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

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

    09.03.2015

    4

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

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

    14.08.2011

    5

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

    1. Создайте список с помощью Xcode

    Введите значение в список

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

    6

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

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

    14.08.2011

    7

    Использование списка - хороший выбор для хранения ваших строк, если строки не являются просто пользовательскими настройками, которые могут быть сохранены в NSUserDefaults. Как уже упоминалось, при использовании plist вы должны сохранить свой список в каталоге Documents, чтобы писать в него, потому что вы не можете писать в ресурсы своего собственного приложения. Когда я впервые узнал об этом, мне было непонятно, где находится каталог Bundle вашего собственного приложения и где находится каталог Documents, поэтому я решил разместить здесь пример кода, который сначала копирует файл plist под названием "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];
    
    06.12.2014

    8

    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
    }
    
    13.07.2015

    9

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

    14.08.2011
  • Почему Core Data предпочтительнее plist для нескольких строк? 15.08.2011
  • Потому что тогда фреймворк позаботится обо всех деталях, таких как обработка файлов, синхронизация и обработка ошибок. 15.08.2011
  • @MarcusKarlsson NSUserDefaults также предоставит эту обработку для OP. Небольшое количество строк в списках OP мне кажется более эквивалентным предпочтениям пользователя, хотя здесь было бы полезно получить дополнительную информацию. 13.06.2012
  • Что делать, если я хочу хранить файлы cookie, а их около 50. Должен ли я в этом случае использовать основные данные, nsuserdefaults или plist? 25.09.2012
  • Новые материалы

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..