NSFetchedResultsController: не обновлять каждую новую ячейку - PullRequest
1 голос
/ 12 декабря 2011

Я заметил, что вставка данных с NSFetchedResultsController в Core Data обновит каждую ячейку в моем Table View, используя метод tableView:cellForRowAtIndexPath:.

Мое приложение запускается при получении более 100 элементов из веб-службы. Когда они добавляются в базу данных базовых данных, для каждой ячейки выполняется вызов tableView:cellForRowAtIndexPath:. Я ожидаю, что обновятся только первые 8-9 видимых ячеек. Как я могу это изменить? Причина, по которой это является проблемой, заключается в том, что мое приложение загружает изображение обложки в первый раз, когда вызывается tableView:cellForRowAtIndexPath - и когда оно вызывается для каждой ячейки, это не оптимальное решение.

EDIT1: Мой код полностью основан на примере из курса CS 192p в Стэнфордском университете . Я скачал их Photomania.zip из лекции 14 и просто вставил метод tableView:willDisplayCell:forRowAtIndexPath:, который отображает имя элемента в журнале при вызове метода. Вы можете взять мой код здесь: http://uploads.demaweb.dk/Photomania.zip. Как вы увидите, похоже, этот метод вызывается для каждого элемента в таблице? Почему?

EDIT2: Я использовал этот метод в своем NSFetchedResultsControllerDelegate из библиотеки разработчиков iOS. Я обнаружил, что withRowAnimation:UITableViewRowAnimationFade заставляет его вызывать cellForRowAtIndexPath и willDisplayCell для каждой ячейки. При изменении значения на withRowAnimation:UITableViewRowAnimationNone вызываются только видимые ячейки.

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

1 Ответ

1 голос
/ 12 декабря 2011

Используете ли вы повторно свои ячейки (т.е. предоставляете идентификатор повторного использования ячейки)?

Реализуете ли вы методы NSFetchedResultsControllerDelegate, которые позволят вашему контроллеру представления вставлять / удалять строки, когда они приходят в оперативный режим вместоделать [tableView reloadData]?В этих методах вы должны использовать '[UITableView insertRowsAtIndexPaths:withRowAnimation:], [UITableView deleteRowsAtIndexPaths:withRowAnimations:] и т. Д. Для настройки ссылочных строк.

Наконец, вы можете вместо этого переместить логику загрузки вашего изображения в UITableView метод делегата tableView:willDisplayCell:forRowAtIndexPath:,Таким образом, он вызывается только тогда, когда он действительно должен отображаться.

...