2010-12-12 8 views
6

내 아이폰 앱에서 수천 개의 개체를 검색하려고하는데 검색이 오래 걸리는 경우가 있습니다. 각 키 입력 후 UI가 1 ~ 2 초 동결됩니다. 이를 방지하기 위해 백그라운드 스레드에서 검색을 실행해야합니다.백그라운드 스레드에서 검색

누군가가 백그라운드 스레드에서 검색을위한 몇 가지 팁을 가지고 있는지 궁금합니다. 나는 NSOperation에 약간을 읽고 웹을 검색했지만 실제로 유용한 것을 찾지 못했습니다.

답변

6

보기 컨트롤러에서 인스턴스 변수로 NSOperationQueue을 사용해보세요.

@interface SearchViewController : UIViewController { 
    NSOperationQueue *searchQueue; 
    //other awesome ivars... 
} 
//blah blah 
@end 

@implementation SearchViewController 

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle { 
    if((self = [super initWithNibName:nibName bundle:nibBundle])) { 
     //perform init here.. 
     searchQueue = [[NSOperationQueue alloc] init]; 
    } 
    return self; 
} 

- (void) beginSearching:(NSString *) searchTerm { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    //perform search... 
    [self.searchDisplayController.searchResultsTableView reloadData]; 
    [pool drain]; 

} 

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
    /* 
     Cancel any running operations so we only have one search thread 
     running at any given time.. 
    */ 
    [searchQueue cancelAllOperations]; 
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self 
                    selector:@selector(beginSearching:) 
                     object:searchText]; 
    [searchQueue addOperation:op]; 
    [op release]; 
} 

- (void) dealloc { 
    [searchQueue release]; 
    [super dealloc]; 
} 
@end 
+0

감사합니다. -beginSearch 내부의 검색이 작동하지만 내 결과를 내 원래 배열 (내 'UITableView'에 사용하는)로 되돌릴 수없는 것 같습니다 ...? 별도의 스레드에서 할당 할 수 있습니까? – fabian789

+0

@ fabian789 잠시만 기다려주십시오 ... 내 대답을 편집하겠습니다 ... –

+0

나는 이렇게했습니다 :'[self performSelectorOnMainThread : @selector (updateArray :) withObject : tmp_filter waitUntilDone : NO]'를 호출 한 다음'[self.searchDisplayController.searchResultsTableView reloadData]''updateArray'에서. 귀하의 솔루션을보고 궁금 ... – fabian789

관련 문제