У меня есть простое приложение, где у меня есть страны, у которых есть города, которые, в свою очередь, имеют людей. Я хочу отобразить список стран в виде таблицы. Я использую NSFetchedResultsController для получения всех данных. Это установка:NSFetchedResultsController метод делегирования вызовов при изменении предикатов
-(void)initializeFetchedResultsController
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Country"];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];
fetchRequest.fetchBatchSize = 30;
self.fetchResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[NSManagedObjectContext managedObjectContext]
sectionNameKeyPath:@"nameFirstLetter"
cacheName:nil];
self.fetchResultsController.delegate = self;
[self.fetchResultsController performFetch:nil];
}
Я также добавил возможность поиска, введя название страны в строке поиска, поэтому я реализовал метод UISearchBarDelegate:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if([searchText isEqualToString:@""])
{
self.fetchResultsController.fetchRequest.predicate = nil;
}
else
{
self.fetchResultsController.fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", searchText];
}
[self.fetchResultsController performFetch:nil];
[self.tableView reloadData];
}
Это работает, но не так, как я хотеть. Я ожидал, что при изменении предикатов мои методы-делегаты NSFetchResultsControllerDelegate будут вызваны снова, чтобы я мог вставлять или удалять элементы/разделы из моего представления таблицы (я хочу анимацию), не задумываясь о том, что было добавлено и удалено. Но это не так, вместо этого, если я изменяю предикат, методы делегирования не вызывают, и я должен сделать простую [self.tableView reloadData]. Я делаю что-то неправильно или это так, как должно работать, и я не могу воспользоваться этим ярлыком?
Сравните http://stackoverflow.com/questions/14797224/uisearchdisplaycontroller-animate-reloaddata для аналогичного вопроса и некоторых идей. –