2

我有一個是迷上了一個NSFetchedResultsController一個UISearchBar如何優化核心數據NSFetchedResultsController用的UISearchBar?

它搜索的用戶將文本輸入到搜索欄。我注意到它滯後的前幾個字母,但後來它加快了起來,它們沒有滯後。有什麼辦法可以減少最初的滯後時間,並使搜索非常活潑?基於你已公佈,我可以看到你創建一個新的FetchedResultsController每個用戶改變搜索字符串時的代碼

- (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]; 
} 

回答

0

。這意味着它不是創建FRC造成滯後。

你運行的mainthread搜索查詢? 這可能是滯後的一個原因。 而這也可以解釋第一查詢滯後比隨後的那些多。這可能是因爲查詢字符串變長並且可能的結果縮小(並且需要更少的處理時間),查詢運行得更快。

編號建議你實現每個按鍵後,等待0.1-0.3秒在進行搜索之前的解決方案。這減少了不必要的搜索查詢,因爲用戶輸入更長的查詢。我建議你在單獨的線程中執行搜索,以避免在搜索過程中鎖定GUI。當搜索線程完成後,您將對mainthread執行回調並使用結果更新屏幕。

相關問題