2012-05-12 3 views
0
  • Редактирование * Поэтому кажется, что я использую это неправильно, и делегат никогда не будет вызван на начальную выборку. Я хотел использовать это для пакетной обработки выборки, поскольку, несмотря на то, что фактическая выборка данных выполняется быстро, пост-обработка не выполняется. Мне просто нужно выключить загрузку в фоновый процесс вместо * Редактировать *

создать 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 не работает при поставке делегат?

+0

сделал вы стараетесь не назначая self.resultsController автореализованный NSFetchedResultsController? – Daniel

+0

Почему? В методе tap, в котором я вызываю функцию fetch, существует NSResultsController, и при втором запуске этого метода теперь будут фактически содержать fetchedObjects. Я просто не могу заставить делегата запускаться сейчас, поэтому строки будут добавлены в UITableView. – Alan

+0

Хорошо вы хотя бы попытались не авторейтировать его? – Daniel

ответ

0

Информация не достаточна. Ну, а не справа информация. Поскольку вы не отправляли сообщения, я должен буду предположить ...

Во-первых, как выглядит ваш запрос на выбор? Правильно ли задает объекты для извлечения? Имеет ли он дескриптор сортировки (требование для запроса на выборку FRC)?

Обычно вы пнуть запрос при загрузке вид контроллера ... руководство Призвание вставки данных, как ваш код шоу, хорошо, пусть просто сказать, нетрадиционно,

+0

Мне не нужны данные для загрузки сразу. Он загружается через взаимодействие с пользователем. И запрос на выборку работает. Я могу использовать managedObjectContext, чтобы отключить запрос и вернуть объекты обратно. И NSFetchedResultsController теперь извлекает объекты также, просто не уволяя методы делегата. – Alan

+0

Так что кажется, что я использую это для неправильной цели и вам нужно будет выполнить выборку в загрузке. Мне не нужно беспокоиться об изменении данных, я просто использовал это для пакетной обработки, что не является целью. – Alan

+0

Если вы просто хотите получить, используйте executeFetchRequest в MOC. FRC предназначен для мониторинга любых изменений в базе данных. –

Смежные вопросы