快速搜索 - iOS

时间:2014-08-08 02:13:54

标签: objective-c search nsregularexpression

我需要搜索一系列错误单词的句子。我有功能,但是,它非常慢:

for (int i=0; i<[badWords count]; i++)
{
    NSDictionary *dictionary = [badWords objectAtIndex:i];
    if ([text rangeOfString:[NSString stringWithFormat:@"\\b%@\\b", [dictionary objectForKey:@"word"]] options:NSCaseInsensitiveSearch | NSRegularExpressionSearch].location != NSNotFound)
    {
        NSLog(@"Bad Word Found!");
    }
}

有更快的方法吗?当我有很长的单词列表需要一段时间。谢谢!

2 个答案:

答案 0 :(得分:0)

也许使用GCD会对速度有所帮助......

dispatch_queue_t dqt = dispatch_queue_create("queue.concurrent",DISPATCH_QUEUE_CONCURRENT);
    dispatch_apply([array count],dqt,^(size_t idx){
        NSDictionary *dictionary = [badWords objectAtIndex:idx];
        if ([text rangeOfString:[NSString stringWithFormat:@"\\b%@\\b", [dictionary objectForKey:@"word"]] options:NSCaseInsensitiveSearch | NSRegularExpressionSearch].location != NSNotFound)
        {
             NSLog(@"Bad Word Found!");
        }
    }
});

dispatch_release(dqt);

但只有一点......

答案 1 :(得分:0)

不是进行多次正则表达式搜索,而是使用每个单词创建一个巨大的正则表达式模式,只进行一次搜索:

NSArray *words = @[@"foo", @"bar", ...];

NSRegularExpression *wordsExpression = [[NSRegularExpression alloc] initWithPattern:[[NSString alloc] initWithFormat:@"\\b(%@)\\b", [keywords componentsJoinedByString:@"|"]] options:NSRegularExpressionCaseInsensitive error:NULL];

[keywordsExpression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
  // do something with match
}];

这在我的测试中非常快(它在几千秒内完成),但是我在x86处理器上使用它。也许ARM处理器的性能特征是不同的,因为RegEx可能没有针对该架构进行优化。

我在这里使用它:https://github.com/abhibeckert/Dux/blob/master/Dux/DuxJavaScriptBaseElement.m