Поиск с помощью UISearchbar идет медленно и блокирует основной поток - PullRequest
1 голос
/ 13 мая 2010

У меня есть таблица с более чем 3000 записей, и поиск очень медленный.

На данный момент я делаю так же, как в примере кода TableSearch (но без областей)

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText: searchString];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

И метод filterContentForSearchText выглядит следующим образом:

- (void) filterContentForSearchText:(NSString*)searchText
{
// Update the filtered array based on the search text

// First clear the filtered array.
[filteredListContent removeAllObjects]; 

// Search the main list whose name matches searchText
// add items that match to the filtered array.
if (fetchedResultsController.fetchedObjects)
{
    for (id object in fetchedResultsController.fetchedObjects)
    {
        NSString* searchTarget = [tableTypeDelegate getStringForSearchFilteringFromObject:object];

        if ([searchTarget rangeOfString:searchText
                options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)].location != NSNotFound)
        {
                [filteredListContent addObject:object];
        }
    }
}
}

У меня двоякий вопрос:

  • Как мне ускорить процесс поиска?
  • Как я могу помешать поиску заблокировать основной поток? то есть остановите его, не позволяя пользователю вводить больше символов.

Во второй части я без особого успеха попробовал «executeSelector: withObject: afterDelay:» и «cancelPreviousPerformRequests ...». Я подозреваю, что мне нужно будет вместо этого использовать многопоточность, но у меня нет большого опыта с этим.

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Ответ на вопрос: «Как я могу ускорить процесс поиска?»

Это показывает, что вы используете основные данные в вашей таблице. Поэтому лучше, чтобы основные данные выполняли фильтрацию за вас.

Итак, создайте новый fetchedResultController, используя NSPredicate для фильтрации.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", searchText];
[fetchRequest setPredicate:predicate];

с использованием MATCHES вместо = позволяет определить сравнение по регулярному выражению (для сравнения без учета регистра)

0 голосов
/ 10 марта 2011

Я закончил поиск как NSOperation, чтобы не блокировать основной поток. Я также сделал, как предложил Рейнхард, и использовал fetchedResultController.

На сайте разработчиков Apple есть действительно хорошее видео о NSOperations. Меня зовут что-то вроде Advanced iPhone часть 1, если я помню.

...