iOS - plist 文件、nsuserdefaults 或文本数据文件
Posted
技术标签:
【中文标题】iOS - plist 文件、nsuserdefaults 或文本数据文件【英文标题】:iOS - plist file, nsuserdefaults or text data file 【发布时间】:2012-07-23 22:05:57 【问题描述】:我正在开发一个需要大量数据的移动应用。简而言之,数据将用于多种语言,并包含该语言可能出现的所有单词。该应用程序将仅以英语和很多单词开头。然后用户可以选择下载更多语言及其数据。
我正在尝试找出读取/保存/更新这些数据的最佳方式。我是否应该先创建一个包含英语数据的 plist 文件,然后在用户下载新语言时继续添加更多数据?还是应该将所有数据保存在 nsuserdefaults 中?或者,我应该只包含一个包含所有数据的文本文件并即时解析它吗?
建议?
ps:我知道这是一个移动应用程序,必须考虑文件空间和解析时间
【问题讨论】:
【参考方案1】:请在此处阅读我的回答:https://***.com/a/7215501/832065
正如该答案中所说,所有 NSUserDefaults 都存储在一个 plist 中。
plist 和 NSUserDefaults 基本相同,但是 NSUserDefaults 应该只用于保存首选项而不是大量数据。所以不要使用 NSUserDefaults!
我会考虑将其保存在 plist (NSDictionary) 中。像这样,您可以在该文件中排序所有数据。只需将“单词”(我假设为 NSString)设置为对象,将语言设置为键。
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
[dict setObject:words forKey:language];
[dict writeToFile:filePath atomically:YES];
阅读也一样:
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSString *words = [dict objectForKey:language];
编辑:
如果每个单词都分配给一个数字(您可以只使用 NSArray),则差别不大:
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
NSArray *words = [NSArray arrayWithObjects:allTheWords,nil];
[dict setObject:words forKey:language];
[dict writeToFile:filePath atomically:YES];
阅读也一样:
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSArray *words = [dict objectForKey:language];
NSString *word = [words objectAtIndex:numberAssignedToWord];
我希望这会有所帮助! :)
【讨论】:
非常感谢您的回答。假设我必须为每个单词分配一个数字,这将是它的关键并且语言是英语,那么结构会是什么样子?例如:tea:3, save:4, water:5, good:4 这些都是英语的一部分。因此,在这种情况下,我们要存储 3 个值 只是添加另一个问题 - 改用 Core Data 怎么样?我只是想找出最好的方法。 您当然可以使用核心数据,但它的设置要困难得多,我会推荐它用于比数组更复杂的东西。接受吗?【参考方案2】:我建议直接使用 SQL 数据库或 Core Data。如果您有大量数据,您不希望一直将这些数据完全加载到内存中。它也更容易处理数据的更新、更改或添加。
但是你的问题太笼统了,并没有说明你真正想要对数据做什么,数据有多大,以 KByte 或 MByte 为单位,很难给出任何好的答案。
将大量数据写入文本文件、用户默认值、plist 或类似文件似乎不是正确的选择。使用 Core Data 将是在 ios 上执行此类操作的默认方式。
【讨论】:
我也在想同样的事情,Core Data 将是要走的路。我要为每种语言创建分隔文本文件,大小在 30-80MB 之间。我想这是一个需要即时解析的大文件。 对。对于在文本文件、数组或任何其他建议的解决方案中管理的数据太多了。这些对于 KByte 大小的少量数据来说很好。因此,您绝对应该考虑 Core Data 或直接使用 SQLite,例如使用 FMDB 或 PLDatabase 等包装框架【参考方案3】:我认为最简单的方法是处理 NSMutableArray
中的数据并使用 NSUserDefaults
将其存储在应用程序中。
您可以在NSMutableArray
中处理您的数据,如下所示:
NSMutableArray *yourDataStuff = [[NSMutableArray alloc] init];
[yourDataStuff addObject:@"Your data 1"];
[yourDataStuff addObject:@"Your data 2"];
[yourDataStuff addObject:@"Your data 3, etc.."];
然后您可以使用NSUserDefaults
存储它,如下所示:
[[NSUserDefaults standardUserDefaults] setObject:yourDataStuff forKey:@"myData"];
然后读取您的数据,如下所示:
yourDataStuff = [[NSUserDefaults standardUserDefaults] objectForKey:@"myData"];
【讨论】:
【参考方案4】:我认为您无法在 NSUserDefault 中保存大数据,并且您可能无法使用 plist 进行 IO,我已经这样做了,当您读取或保存时,您必须读取整个 .plist,并且您可能会收到内存警告,或崩溃。您可以使用C (fread,fwrite) 将数据写入 .txt ,您可以使用数据流进行读写。
【讨论】:
以上是关于iOS - plist 文件、nsuserdefaults 或文本数据文件的主要内容,如果未能解决你的问题,请参考以下文章