テキストを検索するアプリを作成しています(ブロックメソッドを介してテキスト全体を列挙します)。検索コントローラー クラスは、結果を配列にコンパイルし、デリゲート メソッドを介して返します。
デリゲート メソッドを追加する前は結果を取得していたので、検索ロジックが機能していることはわかっています。私が変更したのは、このメソッドをキューで呼び出し、次のようにメイン キューにディスパッチすることです。
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」のバックグラウンドはありませんが、変数のスコープがどのように影響を受けるかを把握していると思いました。私はまだ重要な概念を見逃しているようです。