У меня есть контроллер представления, который является подклассом UITableViewController. Вот мой viewWillAppear: анимированный метод:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (fetchedResultsController != nil) {
[fetchedResultsController release];
fetchedResultsController = nil;
}
[self.fetchedResultsController performFetch:nil];
[self.tableView reloadData];
}
Я запутался, увидев доступ к fetchedResultsController при вызове [super viewWillAppear: animated]. Так как super является UITableViewController, и по сути нет анимированного метода viewWillAppear: для этого класса, тогда должен вызываться его суперкласс viewWillAppear: animated, верно? Если это правильно, то класс UIViewController не должен обращаться к методам делегатов UITableViewController. Но я вижу, что вызывается numberOfSectionsInTableView. Я не уверен, почему вызов super viewWillAppear: animated сделает это.
Поэтому, прежде чем я явно запустил peformFetch и reloadData, таблица заполняется. В то время данные, которые он заполняет, устарели.
Вот код выбранного контроллера результатов
- (NSFetchedResultsController *) fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
NSFetchRequest *fetchRequest = ...
NSEntityDescription * entity = ...
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:10];
NSSortDescriptor *aSortDescriptor = ...
NSSortDescriptor *bSortDescriptor = ...
NSArray *sortDescriptors = ...
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = ...
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
...
[sortDescriptors release];
NSError *error = nil;
if (![fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved Error %@, %@", error, [error userInfo]);
abort();
}
return fetchedResultsController;
}