我正在开发一个基于单词的游戏,我需要将我的180,000字词(1.9MB)加载到一个数组中,这样求解算法就可以使用它。字典每行只有一个单词,如下所示:
a
ab
abs
absolutely
etc
...
现在我正在使用以下代码将该文件加载到数组中:
NSString *txtPath = [[NSBundle mainBundle] pathForResource:@"dict" ofType:@"txt"];
NSString *stringFromFile = [[NSString alloc]
initWithContentsOfFile:txtPath
encoding:NSUTF8StringEncoding
error:&error ];
for (NSString *word in [stringFromFile componentsSeparatedByString:@"\r\n"]) {
[wordsArray addObject:word];
}
在iPhone 4上大约需要3-4秒。在较旧的iOS设备上可能更慢。有更快的方法吗?
答案 0 :(得分:2)
您可以在后台使用Grand Central Dispatch或GCD在主线程中轻松完成此操作。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),^(void){ NSString *txtPath = [[NSBundle mainBundle] pathForResource:@"dict" ofType:@"txt"]; NSString *stringFromFile = [[NSString alloc] initWithContentsOfFile:txtPath encoding:NSUTF8StringEncoding error:&error ]; for (NSString *word in [stringFromFile componentsSeparatedByString:@"\r\n"]) { [wordsArray addObject:word]; } });
我从内存中编写了封闭的调度代码,但它很接近(如果不正确),我认为你明白了。
编辑:您可以在主线程上执行此代码,但会发生的情况是非主线程调度队列是代码执行的位置,因此不会阻止UI。
通过使用以下代码替换for
循环,您可以稍微提高代码的性能:
[wordsArray setArray:[stringFromFile componentsSeparatedByString:@"\r\n"]];
不需要迭代来自-componentsSeparatedByString:
(数组)的结果,只是为了将它们放入另一个数组中。有180K字,这应该是节省大量时间。
答案 1 :(得分:1)
将单词列表预加载到SQLite数据库中可能会更快,然后使用SQL查询使用您拥有的任何模式进行搜索。您可以利用索引使其更快。