如何使用 UISearchBar 优化核心数据 NSFetchedResultsController?

Posted

技术标签:

【中文标题】如何使用 UISearchBar 优化核心数据 NSFetchedResultsController?【英文标题】:How to optimize core data NSFetchedResultsController with UISearchBar? 【发布时间】:2011-12-19 23:50:26 【问题描述】:

我有一个与NSFetchedResultsController 连接的UISearchBar

它在用户在搜索栏中输入文本时进行搜索。我注意到它的前几个字母滞后,但随后它加快了速度并且它们没有滞后。有什么方法可以减少初始延迟并使搜索变得非常快速?

- (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 秒,然后再执行搜索。当用户键入更长的查询时,这会减少不必要的搜索查询。我建议您在单独的线程中执行搜索,以避免在搜索期间锁定 GUI。当搜索线程完成时,您对主线程执行回调并使用结果更新屏幕。

【讨论】:

以上是关于如何使用 UISearchBar 优化核心数据 NSFetchedResultsController?的主要内容,如果未能解决你的问题,请参考以下文章

了解如何将 UISearchBar 与 Core Data 一起使用

NSFetchedResultController 和 UISearchBar 实现

iOS 如何优化数据库 Parse swift 4 的查询

如何在 UITableview 中使用 UISearchBar 在本地 JSON 中获取数据?

UISearchBar 中的 CANCEL 需要很长时间

uisearchbar + uitableview + nsfetchedresultscontroller