如果这是重复,我道歉,但老实说,我已经尽力研究这个并且没有提出太多。
我正在制作一个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");
}
}];
}
我似乎成功地枚举了所有文本中的每个单词,但没有找到返回值,所以我只得到一个永无止境的“未找到”流。
我在每个我确定知道的文本中插入了一个测试短语,但它不会出现。
我有一种感觉,我认为这一切都错了。即使我做了这个工作,对于一个可用的应用程序来说性能打击可能太大了......我仍然试图将我的头围绕在块上。我还没有找到任何现成的解决方案来搜索大量文本并选择结果。如果有人对我可能适应的开源库有任何提示或参考,我将非常感激。
答案 0 :(得分: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");
}
}];
答案 1 :(得分: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];
}
}
}