- (OBDPDFSearchRequest *)obd_searchForText:(NSString *)text completion:(void (^)(OBDPDFSearchRequest *request, NSArray<PTSearchResult *> *results))completion
{
NSParameterAssert(completion);
if (text.length == 0)
{
completion(nil, nil);
return nil;
}
OBDPDFSearchRequest *request = [[OBDPDFSearchRequest alloc] init];
request.isActive = YES;
request.searchString = text;
request.isCancelled = NO;
PTTextSearch *textSearch = [[PTTextSearch alloc] init];
unsigned int mode = e_pthighlight | e_ptambient_string;
__block NSMutableArray <PTSearchResult *> *results = [[NSMutableArray alloc] init];
__weak typeof(self) weakSelf = self;
dispatch_queue_t queue = dispatch_queue_create("com.onboard.pdf.search", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
[weakSelf Lock];
if (request.isCancelled == NO && [textSearch Begin:weakSelf pattern:text mode:mode start_page:-1 end_page:-1])
{
PTSearchResult *result = [textSearch Run];
[weakSelf Unlock];
while (result.IsFound == YES && request.isCancelled == NO)
{
[results addObject:result];
[weakSelf Lock];
result = [textSearch Run];
[weakSelf Unlock];
}
}
else
{
[weakSelf Unlock];
}
if (request.isCancelled == YES)
{
[results removeAllObjects];
}
dispatch_async(dispatch_get_main_queue(), ^{
request.isActive = NO;
completion(request, [NSArray arrayWithArray:results]);
});
});
return request;
}