- Редактирование * Поэтому кажется, что я использую это неправильно, и делегат никогда не будет вызван на начальную выборку. Я хотел использовать это для пакетной обработки выборки, поскольку, несмотря на то, что фактическая выборка данных выполняется быстро, пост-обработка не выполняется. Мне просто нужно выключить загрузку в фоновый процесс вместо * Редактировать *
создать NSFetchedResultsController в методе ViewDidLoad в виде UIViewController и установить делегат себя:NSFetchedResultsController не получает при подаче делегата
self.resultsController = [[[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:[AppDelegate singleton].managedObjectContext sectionNameKeyPath:nil cacheName:nil] autorelease];
self.resultsController.delegate = self;
Тогда, когда ViewController является прослушиваются, я выполняю выборки при необходимости:
int indexPathCount = self.indexPaths.count;
int objectCount = self.resultsController.fetchedObjects.count;
if (indexPathCount && objectCount)
{
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:self.indexPaths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
}
else
{
NSError* error;
BOOL success = [self.resultsController performFetch:&error];
if (!success)
{
UIAlertView* alert = [[[UIAlertView alloc] initWithTitle:@"ERROR" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
[alert show];
}
}
Приведенный выше код не будет получать какие-либо предметы и методы делегата никогда не называются. Если я прокомментирую вышеприведенную строку кода, где я назначаю UIViewController в качестве делегата, то во время второго запуска обработанного кода objectCount будет содержать правильное значение.
- EDIT * Приведенный выше код теперь будет фактически извлекать объекты. При втором прогоне кода objectCount теперь как и ожидалось, но все еще не вызываются методы делегата. Сейчас мое предположение состоит в том, что я делаю что-то плохое с управлением памятью, но все мои счета в счете, похоже, находятся на месте. * EDIT *
Вот реализация методов делегата, но я проверил их на правильность десятки раз над:
- (void)controllerWillChangeContent:(NSFetchedResultsController*)controller
{
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController*)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath*)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath*)newIndexPath
{
switch(type)
{
case NSFetchedResultsChangeInsert:
{
NSIndexPath* tableIndexPath = [NSIndexPath indexPathForRow:newIndexPath.row inSection:self.section];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:tableIndexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.indexPaths addObject:tableIndexPath];
} break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController*)controller
{
[self.tableView endUpdates];
}
Любые идеи о том, почему NSFetchedResultsController не работает при поставке делегат?
сделал вы стараетесь не назначая self.resultsController автореализованный NSFetchedResultsController? – Daniel
Почему? В методе tap, в котором я вызываю функцию fetch, существует NSResultsController, и при втором запуске этого метода теперь будут фактически содержать fetchedObjects. Я просто не могу заставить делегата запускаться сейчас, поэтому строки будут добавлены в UITableView. – Alan
Хорошо вы хотя бы попытались не авторейтировать его? – Daniel