Оптимизировать результаты поиска из адресной книги в iphone - PullRequest
0 голосов
/ 19 марта 2012

Когда пользователь выполняет поиск, я хочу выполнить поиск по данным адресной книги, например, имя, номер телефона, URL, адрес электронной почты.Мое решение работает нормально, но медленно.Если данные адресной книги огромны, приложение застревает.Как я могу оптимизировать поиск, чтобы мое приложение не зависало даже в больших данных адресной книги?

Вот мой код

 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    [self takeSomeActionWhenTextChange];  
}

-(void)takeSomeActionWhenTextChange{
    [contactArray removeAllObjects];
    NSString *searchText=[[textSearchBar text] lowercaseString];


    for (int index=0; index<count; index++) {
        ABRecordRef record=CFArrayGetValueAtIndex(people, index);
        //[self checkStringISAddress:searchText withRecord:record];
        if ([self checkStringIsFirstName:searchText withRecord:record]==YES 
        || [self checkStringIsLastName:searchText withRecord:record] == YES
        ||[self checkStringIsNote:searchText withRecord:record]==YES 
        || [self checkStringIsAddress:searchText withRecord:record]==YES 
        || [self checkStringIsCompany:searchText withRecord:record]==YES 
        ||[self checkStringIsEmail:searchText withRecord:record]
        ||[self checkStringIsPhonenumber:searchText withRecord:record]==YES )
        {
            NSLog(@"object added inside Array");
            [contactArray addObject:record];
            [contactTableView reloadData];
        }else{
            NSLog(@"No Match For this object");
            [contactTableView reloadData];

        }

    }

}

Я проверю, совпадает ли подстрока из поискового запросас именем, фамилией, адресом электронной почты и так далее.Выше методы содержат логику для проверки наличия подстроки или нет?Если ti совпадает, я добавлю его в массив, иначе нет.

ДОЛЖЕН ЛИ Я ИСПОЛЬЗОВАТЬ РЕЗЬБУ ИЛИ GCD ДЛЯ ПЕРЕДАЧИ ПОИСКА?ЕСЛИ ДА, КАК?КАК Я МОГУ ОБНОВИТЬ МОЙ СТОЛОВЫЙ ВИД?

1 Ответ

1 голос
/ 19 марта 2012

Вы можете использовать GCD, вы все равно должны показать индикатор активности, чтобы показать пользователю, что что-то происходит, хотя. Это предотвратит блокировку только основного потока и блокировки пользовательского интерфейса.

Не проверено, вы, конечно, можете установить приоритет очереди, используя также различные константы:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    //Perform the search
    //perform your search here...

    dispatch_async(dispatch_get_main_queue(), ^{

        //Update the UI
        [self.tableView reloadData];
    });
});

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

...