我应该使用NSUserDefaults还是plist来存储数据?

我将存储一些string(也许10-20)。 我不确定是否应该使用NSUserDefaults来保存它们,或者写出来给plist。 什么被认为是最佳实践? NSUserDefaults似乎是更less的代码行,因此更快实施。

我想补充一点,这些string值将被用户添加/删除。

我假设一个数组,但它也将与字典一起工作。

Userdefaults,Core Data和Plists都可以读/写,但是如果你使用plist,你需要注意你放在哪个目录下。 看下面的plist部分。

核心数据我认为这太过分了,只是string。 当你想要保存更复杂的对象时应该使用它。

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

如果你的string将被修改,你将需要编写和阅读plist,但是你不能写入你的应用程序的资源。

  1. 有一个读/写plist首先find文件目录

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"]; 
  2. 创build数组(我假设string是string1,…)

     NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil]; 
  3. 把它写入文件

     [stringsArray writeToFile:stringsPlistPath atomically:YES]; 

阅读plist:

  1. find文件目录

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"]; 
  2. 阅读:

     NSArray *stringsArray = [NSArray arrayWithContentsOfFile:stringsPlistPath]; 

如果你正在存储10-20个string,并且正在寻找不太多的代码行,核心数据肯定是太多的开销。 我build议和plist一起去。 不是很多的代码:

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

iOS最终将所有NSUserDefaults数据存储到plist文件。 所以,如果这是你的担心,它不会影响性能。 我个人比较喜欢用NSUserDefaults来处理小数据,用NSUserDefaults处理相对较大的数据。

注意:不要在NSUserDefaults存储任何敏感信息,因为任何人都可以看到这些数据。

NSUserDefaults将用户的喜好存储到一个文件中的Library / Preferences文件夹中。 理论上它只用于存储一些应用程序/用户属性。

Plist文件是有用的pipe理一个单一的文件。 如果你需要pipe理更多,你应该使用Coredata。 plist文件的大小没有限制。 否则,你必须小心plist文件,因为当你需要保存或读取文件的全部内容将被加载到内存中。

这取决于你想要存储什么,为什么。 NSUserDefaults是为了存储用户的喜好。 你可以尝试用它来做其他的事情,但是你可能不应该这样做。

否则,如果你的需求很简单,一个plist文件是非常简单的。 您也可以使用核心数据或自己的文件格式。 一般来说,我使用plist来执行简单的任务,然后转移到核心数据来处理更复杂的任务。

如果string不只是NSUserDefaults中的用户设置,使用plist是存储string的好select。 如前所述,使用plist时,必须将plist存储在Documents目录中才能写入,因为无法写入自己的应用程序资源。 当我第一次了解到这一点的时候,我并不清楚你自己的应用程序的Bundle目录是在哪里与Documents目录是在哪里,所以我想我会在这里发布示例代码,首先复制名为“Strings.plist”的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]; 

NSUSerDefaults确实很快实现,但主要是随着你的应用程序的增长,你想存储越来越多,我直接去了plist文件。

大多数人想要存储一些东西,所以这里是我的共享如何使用NSDictionary做到这一点。 这并不要求你先创build一个plist文件,它会在第一次创build时保存一些东西

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(path:primefaces:)

在写出文件之前,此方法recursion地validation所有包含的对象是属性列表对象( NSDataNSDateNSNumberNSStringNSArrayNSDictionary实例),如果所有对象不是属性列表对象,则返回NO生成的文件不会是有效的属性列表。

所以无论你在dict.SetObject()设置了什么, dict.SetObject()应该是上面提到的types之一。

装载

 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 } 

保持这种数据的推荐方式是使用核心数据。 虽然NSUserDefaults可以用来存储更多或更less的东西,但只能用于存储首选项。

使用.plist

  1. 使用Xcode创build一个plist

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