Как оптимизировать данные ядра NSFetchedResultsController с помощью UISearchBar?

У меня есть 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 ответ

Решение

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

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

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

Другие вопросы по тегам