3

如果这是重复,我深表歉意,但老实说,我已尽我最大的努力对此进行研究,但并没有想出太多。

我正在制作一个 iPad 参考应用程序,它可以搜索几本大型教科书(可能总共 3-4k 页)。这是一个相当简单的想法:用户可以选择任何文本组合进行搜索,输入他的词条,应用程序将在所有文本中找到这些词条并将它们返回,并在表格视图中进行索引。

视图控制器有一系列开关,它们的值通过方法读取到 NSSet 中并传递给搜索控制器。那部分有效。

我有一个 SearchController 类,视图控制器实例化并调用一个方法:

-(void)performSearchWithString:(NSString *)searchString andTexts:(NSSet *)texts
{
for (id book in texts) {
    if ([book isEqual:kBook1]){
        NSError *error = nil;
        NSURL *url = [[NSBundle mainBundle] URLForResource:@"neiJing" withExtension:@"txt"];
        NSString *text = [NSString stringWithContentsOfURL:url encoding:NSStringEncodingConversionAllowLossy error:&error];
        [text enumerateSubstringsInRange:NSMakeRange(0, [text length])
                                 options:NSStringEnumerationByWords
                              usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                                  NSRange found = [substring rangeOfString:text];
                                  if (found.location != NSNotFound) {
                                      NSLog(@"%@", substring);
                                  } else {
                                      NSLog(@"Not found");
                                  }
                              }];
    }

我似乎已经成功地枚举了所有文本中的每个单词,但没有找到返回值,所以我得到了一个永无止境的“未找到”流。

我在每个我知道肯定存在的文本中插入了一个测试短语,但它没有出现。

我有一种感觉,这一切都错了。即使我完成了这项工作,对于可用的应用程序而言,性能影响可能太大了......我仍在尝试将我的头绕在块上。我只是没有找到任何现成的解决方案来搜索大量文本并挑选结果。如果有人对我可能改编的开源库有任何提示或参考,我将不胜感激。

4

2 回答 2

2

看起来您正在搜索传递给块的每个子字符串内的整个文本。此行是问题所在(并导致保留周期):

NSRange found = [substring rangeOfString:text];

代码需要寻找它可以找到的东西:

NSString *findMe = @"A string we expect to find";        
[text enumerateSubstringsInRange:NSMakeRange(0, [text length])
                         options:NSStringEnumerationByWords
                      usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                                  if ([findMe isEqualToString:substring] ) {
                                      NSLog(@"Found %@", substring);
                                  } else {
                                      NSLog(@"Not found");
                                  }
                              }];
于 2013-03-28T01:00:26.027 回答
1

我不认为代码块是你想要的。它遍历文本中的每个单词,并且您想要找到所有搜索字符串。这是一个基于最后一次成功匹配设置新搜索范围的循环。

-(void)performSearchWithString:(NSString *)searchString andTexts:(NSSet *)texts
{
for (id book in texts) {
    if ([book isEqual:kBook1]){
        NSError *error = nil;
        NSURL *url = [[NSBundle mainBundle] URLForResource:@"neiJing" withExtension:@"txt"];
        NSString *text = [NSString stringWithContentsOfURL:url encoding:NSStringEncodingConversionAllowLossy error:&error];

        NSRange searchRange = NSMakeRange(0, [text length]);
        NSRange match = [text rangeOfString:searchString options:0 range:searchRange];
        while (match.location != NSNotFound) {

            // match is the range of the current successful match
            NSLog(@"matching range -- %@", NSStringFromRange(match));

            NSUInteger locationOfNextSearchRange = NSMaxRange(match);
            searchRange = NSMakeRange(locationOfNextSearchRange, [text length] - locationOfNextSearchRange);
            match = [text rangeOfString:searchString options:0 range:searchRange];
        }
    }
}
于 2013-03-28T01:27:18.093 回答