Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Plist

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

  • Чтобы слой чтения/записи сначала нашел каталог документов

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

    NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];
    
  • Записать его в файл

    [stringsArray writeToFile:stringsPlistPath atomically:YES];
    

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

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

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
    
  • Прочтите это:

    NSArray *stringsArray = [NSArray arrayWithContentsOfFile:stringsPlistPath];
    

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Итак, все, что вы установили в 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
}

Ответ 8

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

Ответ 9

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

  • Создание 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"];