Как оптимизировать данные ядра NSFetchedResultsController с помощью UISearchBar? - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть UISearchBar, который подключен к NSFetchedResultsController.

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

- (void)filterResultsUsingString:(NSString *)filterString {
    self.billingSearchText = filterString;      

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];
    NSEntityDescription *entity = nil;
    if ([self.billingSearchCategory isEqualToString:@"icd9"]) {
         entity = [NSEntityDescription entityForName:@"ICD9" inManagedObjectContext:managedObjectContext];
    }
    else if ([self.billingSearchCategory isEqualToString:@"cpt"]) {
        entity = [NSEntityDescription entityForName:@"CPT" inManagedObjectContext:managedObjectContext];
    }

    [fetchRequest setEntity:entity];
    [sortDescriptors release];
    [sortDescriptor release];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];

    [fetchRequest release];
    NSPredicate *predicate =[NSPredicate predicateWithFormat:@"(name contains[cd] %@) OR (code contains[cd] %@)", self.billingSearchText, self.billingSearchText];
    [self.fetchedResultsController.fetchRequest setPredicate:predicate];
    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) 
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    } 

    [self.tableView reloadData];
}

1 Ответ

0 голосов
/ 29 декабря 2011

Основываясь на опубликованном вами коде, я вижу, что вы создаете новый FetchedResultsController каждый раз, когда пользователь изменяет строку поиска.Это означает, что это не создание FRC, которое вызывает задержку.

Запускаете ли вы поисковый запрос на основной теме?Это может быть одной из причин отставания.И это также может объяснить, что первый запрос отстает больше, чем последующие.Это может быть связано с тем, что запрос выполняется быстрее, так как строка поиска становится длиннее, а возможные результаты сужаются (и требуют меньшего времени обработки).

Id предлагает вам реализовать решение, которое ждет 0,1-0,3 секунды после каждого нажатия клавишиперед выполнением поиска.Это уменьшает ненужные поисковые запросы, поскольку пользователь вводит более длинные запросы.И я бы посоветовал вам выполнить поиск в отдельном потоке, чтобы избежать блокировки графического интерфейса во время поиска.Когда поиск завершен, вы выполняете обратный вызов основной темы и обновляете экран с результатами.

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