알티베이스 메뉴얼 앱을 최초 개발 할 때의 일이다.
기본 아이디어가 알티베이스 메뉴얼 pdf 파일이 여러 개이고
사용자는 이 여러 개의 pdf 파일에서 검색어 하나로 찾고 싶어 할 것이라는 가정 하에
찾을 대상에 pdf 파일 선택 화면을 만들고
선택된 pdf 파일에서 검색어로 키워드를 찾는 것이다.
pdf에서 text 를 검색하는 것은 상당한 시간이 걸리는 작업이고
이를 여러 파일에 대해서 하려니 UI가 그동안 얼어 버린다.
해서 thread로 구현 해야 했다.
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
[searchBar resignFirstResponder];
[self.view bringSubviewToFront:webActInd];
[webActInd startAnimating];
[resultFilename removeAllObjects];
[resultThumbImg removeAllObjects];
[resultPageNum removeAllObjects];
[tableView_ reloadData];
//스레드
searchText = [NSString stringWithString:searchBar.text];
[NSThread detachNewThreadSelector:@selector(searchDoJob) toTarget:self withObject:nil];
//[webActInd stopAnimating];
}
알티베이스 메뉴얼 버젼 1.0에서 검색 버튼을 눌렀을 때 코드이다.
NSThread 를 사용하여 구동 될 메서드 searchDoJob을 설정 한다.
- (void) searchDoJob
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//pdfSearch = [[[PDFSearch alloc]init]autorelease];
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSString *text = [NSString stringWithString:searchText];
//모든 파일이름을 루프로 돌려 검색 한다.
for (NSInteger j = 0; j< [filename_ count]; j++)
{
NSString * filename = [filename_ objectAtIndex:j];
if ([userDefault boolForKey:filename])
{
// NSURL *pdfURL = [[NSBundle mainBundle] URLForResource:filename withExtension:@"pdf"];
//
// MFDocumentManager *documentManager = [[MFDocumentManager alloc]initWithFileUrl:pdfURL];
// CGPDFDocumentRef document = CGPDFDocumentCreateWithURL(( CFURLRef)pdfURL);
// for (NSInteger i=1; i< CGPDFDocumentGetNumberOfPages(document); i++ )
// {
// CGPDFPageRef PDFPage = CGPDFDocumentGetPage(document, i);
//
// if ([pdfSearch page:PDFPage containsString:text] )
// {
// NSString * pageNumStr= [NSString stringWithFormat:@"%i",i];
// [resultFilename addObject:filename];
// [resultPageNum addObject:pageNumStr];
//
// [resultThumbImg addObject:[self imageFromPDFWithDocumentRef:document andPageNum:i]];
//
// if ([resultFilename count] > 100)
// break;
//
// [tableView_ reloadData];
// }
//
// }
// CGPDFDocumentRelease(document);
}
if ([resultFilename count] > 100)
break;
}
[webActInd stopAnimating];
[pool release];
}
선택된 파일들 (filename_ ) array에서 CGPDocuemntRef를 이용해서 주석처리된 부분이 실제로 PDF파일에서 문자열 검색을 하는 부분이고 결과로 pdf 파일 명과 페이지 번호 그리고 썸네일 이미지를 생성하는 부분이다.
현재 1.5버젼 이상 부 터는 fastpdfkit 라이브러리를 사용하기 때문에 관련 코드는 모두 주석 처리 되었다.
이렇게 수행 시간이 오래 걸리는 작업을 처리 하기 위해서는 NSThread가 필요하다.