仅当委托方法完成时才迭代 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
});
我正在使用 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
});