2

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

4

2 回答 2

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
                                    编码:NSUTF8StringEncoding
                                    错误:&错误];       
        for (NSString *word in [stringFromFile componentsSeparatedByString:@"\r\n"]) {
            [wordsArray addObject:word];
        }
});

我从内存中编写了封闭的调度代码,但它很接近(如果不正确),我想你明白了。

编辑:您可以在主线程上执行此代码,但发生的是非主线程调度队列是您的代码执行的地方,因此不会阻塞 UI。

for您可以通过将循环替换为以下代码来稍微提高代码的性能:

[wordsArray setArray:[stringFromFile componentsSeparatedByString:@"\r\n"]];

应该不需要迭代-componentsSeparatedByString:(一个数组)的结果,只是将它们放入另一个数组中。有了 180K 字,这应该可以节省大量时间。

于 2012-04-13T18:25:27.970 回答
1

将单词列表预加载到 SQLite 数据库中可能会更快,然后使用 SQL 查询使用您拥有的任何模式进行搜索。您可以利用索引使其更快。

于 2012-04-13T18:45:36.617 回答