仅当委托方法完成时才迭代 NSArray 中的下一项

Iterate through next item in NSArray only when Delegate method has finished

我正在使用 OCR (Tesseract) 扫描图片。然而,Tesseract 在识别单词时并不总是准确的,像 "kitchen" 和 "potato" 可能被识别为 "k1thn" 和 "oolat0"。

为了 'correct' 这些错误识别的词,我想使用库 PermissiveResearch 来搜索并再次匹配预定义的可能词列表。

令我惊讶的是,该库运行得非常好,但也有一个缺点。它被构建为仅在大型数据源中搜索 一个词 。 OCR扫描的结果是多个单词的NSArray。

所以合乎逻辑的做法是像这样遍历 NSArray:

for (ScannedWord *scannedWord in inputArray) {
    [[PermissiveResearchDatabase sharedDatabase] searchString:scannedWord.name withOperation:ScoringOperationTypeExact];
}

我遇到的问题是,搜索结果被捕获在仅被调用 一次 的委托方法 (-(void)searchCompletedWithResults:(NSArray *)results) 中当它完成搜索时。即使我正在遍历 NSArray 并多次调用 [[PermissiveResearchDatabase sharedDatabase] searchString:scannedWord.name withOperation:ScoringOperationTypeExact];

如何使用此库对 NSArray 进行允许搜索?

或者您推荐不同的方法(使用不同的库)?

你能否只从 inputArray 中的一个单词开始匹配,然后从委托方法中继续数组的其余部分?

开始:

self.copyArray = [inputArray mutableCopy];
NSDictionary * scannedWord = [self.copyArray objectAtIndex:0];
[copyArray removeObjectAtIndex:0];
[[PermissiveResearchDatabase sharedDatabase] searchString:scannedWord.name withOperation:ScoringOperationTypeExact];

INSIDE DELEGATE(成功或错误继续处理 inputArray

if(self.copyArray.count > 0)
{
    NSDictionary * scannedWord = [self.copyArray objectAtIndex:0];
    [copyArray removeObjectAtIndex:0];
    [[PermissiveResearchDatabase sharedDatabase] searchString:scannedWord.name withOperation:ScoringOperationTypeExact];
}

这样,您将同步地迭代 inputArray 元素,并且在我看来不会遗漏任何元素。

顺便说一句,我没有 xcode,所以代码中可能有错别字

这个我没测试过,不清楚PermissiveResearch库是否支持并发操作,不过你应该可以用这样的东西

NSOperationQueue* aQueue = [[NSOperationQueue alloc] init];

// If you find problems with concurrency you can limit the queue to a single operation at a time -
// aQueue.maxConcurrentOperationCount=1;    

NSMutableArray *outputArray=[inputArray mutableCopy];

NSMutableArray *operationArray=[NSMutableArray new];

for (int i=0;i<inputArray;i++) {

  operation = [ExactScoringOperation new];

  operation.searchedString = inputArray[i];

  SearchCompletionBlock block = ^(NSArray *results) {
        @synchronized(outputArray) {
            outputArray[i]=results[0];
        }
  };

  [operation setCustomCompletionBlock:block];
  [operationArray addObject:operation];

}

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [aQueue addOperations:operationArray waitUntilFinished:YES];

    // Output array now contains the updated words.
    // Perform any UI updates on the main queue
});