Должен ли я использовать NSUserDefaults или plist для хранения данных?
Я буду хранить несколько строк (возможно, 10-20). Я не уверен, что я должен использовать NSUserDefaults для их сохранения или записать их на plist. Что считается лучшей практикой? NSUserDefaults похоже, что это меньше строк кода, поэтому быстрее реализовать.
Я хотел бы добавить, что эти строковые значения будут добавлены/удалены пользователем.
Ответы
Ответ 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"];