У меня есть UISearchDisplayController, который изменяет NSP-предикат NSFetchRequest при каждом изменении searchBar. Этот запрос на выборку связан с NSFetchedResultsController, который обновляет searchResultsTableView.
Они работают без сбоев на устройствах iOS> = iPhone 3GS, но с треском проваливаются на устройствах iPhone 3G, полностью замораживая пользовательский интерфейс, как только содержимое панели поиска даже слегка изменяется. Это даже происходит, если в постоянном хранилище вообще нет записей.
Извлечение фактически выполняется, потому что приложение не закрывается из-за выхода (-1).
Кто-нибудь видел такую проблему или есть идеи, как ее решить?
(Делается это на iOS 4.3SDK с целевым значением развертывания 4.0. IPhone 3G, который зависает под OS 4.2.1.)
Код для создания поиска FRC:
-(NSFetchedResultsController *)searchFetchedResultsController {
if (__searchResults) {
return __searchResults;
}
NSFetchRequest *fetchrequest = [[NSFetchRequest alloc] init];
[fetchrequest setEntity:[NSEntityDescription entityForName:@"Product" inManagedObjectContext:[[LBCCacheManager sharedLBCCacheManager] managedObjectContext]]];
[fetchrequest setFetchBatchSize:20];
[fetchrequest setPropertiesToFetch:[NSArray arrayWithObjects:@"title", @"slug", nil]];
NSSortDescriptor *recentSort = [NSSortDescriptor sortDescriptorWithKey:@"dealsCount" ascending:NO];
[fetchrequest setSortDescriptors:[NSArray arrayWithObject:recentSort]];
NSFetchedResultsController *fetchedcontroller = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchrequest
managedObjectContext:[[LBCCacheManager sharedLBCCacheManager] managedObjectContext]
sectionNameKeyPath:nil
cacheName:nil];
fetchedcontroller.delegate = self;
[__searchResults release], __searchResults = nil;
__searchResults = [fetchedcontroller retain];
[fetchedcontroller release];
[fetchrequest release];
return __searchResults;
}
Код для каждого изменения панели поиска:
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
if ([controller.searchBar.text length] > 0) {
[self contentFilter:controller];
}
return YES;
}
-(void)contentFilter:(UISearchDisplayController *)controller {
[[self searchFetchedResultsController].fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"title contains[c] %@", controller.searchBar.text]];
NSError *error = nil;
if (![[self searchFetchedResultsController] performFetch:&error]) {
NSLog(@"ERROR");
exit(-1);
}
}