我正在制作一个搜索文本的应用程序(通过块方法枚举整个文本)。搜索控制器类应该将结果编译成一个数组,然后通过委托方法返回。
我知道搜索逻辑正在工作,因为在添加委托方法之前,我正在获取结果,并且我的 resultsCount 整数仍在记录预期的结果数。我所做的更改是在队列中调用此方法,并将其分派回主队列,如下所示:
searchQueue = dispatch_queue_create("searchQueue", NULL);
dispatch_async(searchQueue, ^{
dispatch_async(dispatch_get_main_queue(), ^ {
[controller performSearchWithString:searchText andTexts:[self textsToSearch]];
});
由于我这样做了,我的实际数组没有拾取任何这些对象(或者它立即转储它们?) - 它总是记录“null”。我不知道为什么。将数组声明为 __block 对象不会更改它,也不会将其创建为类的属性。这是我的方法代码:
-(void)performSearchWithString:(NSString *)searchString andTexts:(NSSet *)texts
{
NSMutableArray *pendingResults = nil;
__block int resultsCount = 0;
NSError *error = nil;
for (id book in texts) {
if ([book isEqual:kBook1]){
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 ([searchString caseInsensitiveCompare:substring] == NSOrderedSame) {
SearchResult *result = [[SearchResult alloc] init];
result.title = @"neiJing";
result.author = @"Author";
//result.excerpt = substring; // Add logic to configure excerpt range
result.range = NSMakeRange(substringRange.location-500, substringRange.length + 500);
result.excerpt = [NSString stringWithFormat:@"...%@...",[text substringWithRange:result.range]];
[pendingResults addObject:result];
NSLog(@"%@", pendingResults);
resultsCount++;
}
}];
}
if (error == nil) {
[self.delegate SearchControllerDidReturnResults:[NSArray arrayWithArray:pendingResults]];
}
非常感谢任何帮助。我仍然很难理解块,没有任何直接“C”的背景,但我认为我掌握了变量范围是如何受到影响的。似乎我仍然缺少一个关键概念。