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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Использование 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]; 

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

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

xcode 7 beta, Swift 2.0

экономия

 func SaveItemFavorites(items : Array) -> 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 { 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() if let arrayitems = dictitems as? NSArray { for var i = 0;i 

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

Использование .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"]; 
  • UIImage imageNamed требует pathForResource?
  • Странная проблема сравнения поплавков в объективе-C
  • Выбор случайного объекта в NSArray
  • iPhone: обнаружение бездействия пользователя / время простоя с момента последнего касания экрана
  • Нарисуйте часть круга
  • Содержимое HTML соответствует UIWebview без масштабирования
  • Проблема автосохранения кадра UICollectionViewCell contentView в ячейке прототипа Storyboard (Xcode 6, iOS 8 SDK) происходит при запуске только на iOS 7
  • UIPageViewController не возвращает никаких распознавателей жестов в iOS 6
  • Как размыть сцену в SpriteKit?
  • Как я могу добавить объекты CGPoint в NSArray простым способом?
  • Можно ли изменить цвет фона UIButtons?
  • Давайте будем гением компьютера.