Как увеличить скорость поиска в Iphone SDK - PullRequest
3 голосов
/ 16 ноября 2010

В моем приложении iphone отображается табличное представление со списком из 6000 элементов. (эти элементы находятся в файле SQLite)

Пользователь может искать эти предметы. НО, когда я нажимаю кнопку «Поиск» и начинаю вводить первую букву, у меня уходит много времени, прежде чем я могу ввести вторую букву. Точно так же требуется много времени, чтобы набрать каждую букву, прежде чем я смог начать поиск.

Есть ли способ увеличить скорость набора на панели инструментов поиска, чтобы пользователь мог быстро ввести 5-6 букв для поиска?

Я ценю вашу помощь. Спасибо!

Ответы [ 3 ]

6 голосов
/ 16 ноября 2010

Если ваш поиск слишком медленный и, следовательно, блокирует пользовательский интерфейс, вы должны выполнять поиск асинхронно, чтобы не блокировать основной поток.Для этого есть много опций, включая 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 может быть лучше в этом случае).

1 голос
/ 16 ноября 2010

Вместо того, чтобы искать по всему списку каждый раз, когда вызывается textDidChange, можете ли вы искать его только тогда, когда вместо него вызывается searchBarSearchButtonClicked?

Вы потеряли бы автоматическое обновление по типу, но это не создавало бы задержку, которую вы видите каждый раз.

0 голосов
/ 17 ноября 2010

Я не знаю, проиндексирована ли ваша таблица.Если нет, вы должны создать индекс для вашей таблицы.Обновление таблицы будет медленнее, но поиск должен быть быстрее.Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...