仅当Delegate方法完成时,迭代NSArray中的下一个项目

时间:2015-01-15 22:08:36

标签: ios objective-c loops search nsarray

我正在使用OCR(Tesseract)来扫描图片。然而,Tesseract并不总是准确地识别单词和单词,如" kitchen"和#34;马铃薯"可以被认为是" k1thn"和" oolat0"。

要纠正'这些错误识别的单词我想使用库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上进行许可搜索?

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

2 个答案:

答案 0 :(得分:1)

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

START:

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因此,代码中的偏移是错误的

答案 1 :(得分:0)

我还没有对此进行测试,并不清楚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
});