2013년 4월 25일 목요일

iOS 프로그래밍 팁 - NSThread 사용하기

알티베이스 메뉴얼 앱을 최초 개발 할 때의 일이다.
기본 아이디어가 알티베이스 메뉴얼 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가 필요하다.

댓글 없음: