Если ваш поиск слишком медленный и, следовательно, блокирует пользовательский интерфейс, вы должны выполнять поиск асинхронно, чтобы не блокировать основной поток.Для этого есть много опций, включая Grand Central Dispatch (4.0+), NSOperation
, performSelectorInBackground:...
.Лучший подход для вас зависит от архитектуры вашего приложения / алгоритма и от того, что вам удобнее.
Редактировать: для начала прочитайте документацию по performSelectorInBackground:withObject:
и performSelectorOnMainThread:withObject:waitUntilDone:
.Из метода делегата панели поиска попробуйте вызвать что-то вроде:
// -searchForString: is our search method and searchTerm is the string we are searching for
[self performSelectorInBackground:@selector(searchForString:) withObject:searchTerm];
Теперь Какао создаст фоновый поток и вызовет ваш пользовательский метод -searchForString:
в этом потоке.Таким образом, основной поток не будет заблокирован.Пользовательский метод должен выглядеть примерно так:
- (void)searchForString:(NSString *)searchTerm
{
// First create an autorelease pool (we must do this because we are on a new thread)
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Perform the search as you normally would
// The result should be an array containing your search results
NSArray *searchResults = ...
// Pass the search results over to the main thread
[self performSelectorOnMainThread:@selector(searchDidFinishWithResult:) withObject:searchResults waitUntilDone:YES];
// Drain the ARP
[pool drain];
}
Теперь пользовательский метод searchDidFinishWithResult:
отвечает за обновление пользовательского интерфейса с результатами поиска:
- (void)searchDidFinishWithResult:(NSArray *)searchResult
{
// Update the UI with the search results
...
}
Это, вероятно,Самый простой подход для начала.Решение еще не завершено, отчасти потому, что задачи поиска будут накапливаться, если пользователь печатает быстрее, чем может выполнить поиск.Возможно, вам следует включить таймер простоя, который ждет некоторое время, пока поиск не будет запущен, или вам нужно будет отменить текущую задачу поиска (NSOperation
может быть лучше в этом случае).