2010-12-12 3 views
6

Я пытаюсь выполнить поиск по нескольким тысячам объектов в приложении для iPhone, однако поиск сильно отстает - после каждого нажатия клавиши пользовательский интерфейс замерзает на 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

Смежные вопросы