2015-04-13 4 views
0

У меня есть довольно большой массив, который я получаю из своей базы данных peopleArray, которая состоит из всех пользователей моего приложения. Этот массив используется для поиска друзей. Моя проблема заключается в том, что когда пользователь начинает вводить строку поиска, приложение часто замерзает на мгновение, прежде чем отобразит поиск пользователя.Выполнять поиск по массиву в фоновом режиме?

#pragma mark - SEARCH BAR 

- (void) filterContententForSearchText: (NSString *) searchText scope:(NSString *) scope{ 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K beginsWith[cd] %@",@"Name", searchText ]; 
self.searchArray = [self.peopleArray filteredArrayUsingPredicate:predicate]; 
} 

- (BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{ 
[self filterContententForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]]; 
return YES; 
} 

- (void) searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller{ 
[self.tableView reloadData]; 
} 

Я хотел бы сделать это в фоновом режиме, так что я могу поставить в Tableview в UIActivityIndicator, как он загружает, но не уверен, где и как реализовать этот способ в фоновом режиме.

ответ

0

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

//I put this in my private @interface 
@property (nonatomic, strong) NSTimer *searchTimer; 

//Then we have the method called on keypress 
- (void)whateverMethodIsCalledOnKeypress { 
    [self.searchTimer invalidate]; 
    self.searchTimer = nil; 
    //put some logic that returns out of the function for empty strings etc. here 
    self.searchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(runSearch) userInfo:nil repeats:NO]; 
} 

- (void)runSearch { 
    //do whatever you need to run the search this way 
    //it's only ever done at most once per second 
    //so fast typists don't overload the processor 
} 

И вот какой код для асинхронной фильтрации.

//Show your activity indicator 
dispatch_async(dispatch_get_global_queue(0,0), ^{ 
    //call whatever you need to do on the filtering here 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     //Hide your activity indicator 
     [self.tableView reloadData]; 
    }); 
}); 
Смежные вопросы