将单词列表字典加载到数组中的最快方法?

时间:2012-04-13 18:18:08

标签: objective-c ios memory

我正在开发一个基于单词的游戏,我需要将我的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设备上可能更慢。有更快的方法吗?

2 个答案:

答案 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查询使用您拥有的任何模式进行搜索。您可以利用索引使其更快。