2011-12-23 2 views
0

Я реализую мобильный локальный поиск в приложении iPhone:iPhone-мобиль локальной оптимизация поиска

- (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText { 

     //Remove all objects first. 
     [copyListOfItems removeAllObjects]; 

     if([searchText length] > 0) { 

      [ovController.view removeFromSuperview]; 
      searching = YES; 
      letUserSelectRow = YES; 
      self.tableView.scrollEnabled = YES; 
      [self searchTableView]; 
     } 
     else { 

      [self.tableView insertSubview:ovController.view aboveSubview:self.parentViewController.view]; 

      searching = NO; 
      letUserSelectRow = NO; 
      self.tableView.scrollEnabled = NO; 
     } 

     [self.tableView reloadData]; 
    } 



    - (void) searchTableView { 

     NSString *searchText = searchBar.text; 
     NSMutableArray *searchArray = [[NSMutableArray alloc] init]; 

     for (NSDictionary *dictionary in listOfItems) 
     { 
      NSArray *array = [dictionary objectForKey:@"key_pdescription"]; 
      [searchArray addObjectsFromArray:array]; 
     } 

//in requirement searchArray has more than 50k objects 
     for (NSString *sTemp in searchArray) 
     { 
      NSRange titleResultsRange = [sTemp rangeOfString:searchText options:NSCaseInsensitiveSearch]; 

      if (titleResultsRange.length > 0) 
       [copyListOfItems addObject:sTemp]; 
     } 

     [searchArray release]; 
     searchArray = nil; 
    } 

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

+1

Пройдите эту ссылку также http://stackoverflow.com/questions/3067543/core-data-and-paging – User97693321

ответ

0

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

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
//[request setEntity:entity]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"predicateformart"]; 
[request setPredicate:predicate]; 
[request setFetchLimit:100];//100 records for example 
0

Проблема заключается в методе searchTableView.
Во-первых: не создавайте searchArray каждый раз, когда вы выполняете поиск, лучший выбор - построить его на viewDidLoad.
Во-вторых: использовать

[NSArray filteredArrayUsingPredicate:(NSPredicate *)predicate] 

вместо инструкции сравнения.

Смежные вопросы