Бесконечная прокрутка TableView с использованием FetchLimit и основных данных в IOS - PullRequest
0 голосов
/ 19 января 2019

У меня есть тысячи строк данных в базовых данных. Выполнение такой большой выборки значительно замедляет работу UX. Поскольку я позволяю пользователю просматривать данные различными способами, перезагрузки являются обычным делом, и перезагрузка FRC может быть болезненной. Соответственно, я добавил FetchLimit в свой Fetch, скажем, 50. 50 отлично подходит для скорости, но тянет только часть строк, поэтому старые данные просто недоступны.

Я хотел бы реализовать бесконечную прокрутку, чтобы свежие строки загружались, когда пользователь попадает в нижнюю часть TableView. Я могу запустить перезагрузку, используя любой из нескольких методов делегата, таких как:

  - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
        NSInteger lastSectionIndex = [tableView numberOfSections] - 1;
        NSInteger lastRowIndex = [tableView numberOfRowsInSection:lastSectionIndex] - 1;
        if ((indexPath.section == lastSectionIndex) && (indexPath.row == lastRowIndex)) {
            // This is the last cell
            [self getMore];
        }
    }

Моя проблема в том, что использовать для получения большего. Следующее работает, но кажется неуклюжим, так как вам нужно перезагрузить все предыдущие ячейки, и становится трудно отследить, где вы находитесь в fetchLimit. Есть ли более эффективный способ выполнения бесконечной прокрутки?

   - (void)getMore {
        [self.fetchedResultsController.fetchRequest setFetchLimit:newFetchLimit];
       self.fetchedResultsController = nil;
        NSError *error;
        if (![self.fetchedResultsController performFetch:&error]) {
            // Update to handle the error appropriately.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        }

        [self.tableView reloadData];
    }

1 Ответ

0 голосов
/ 01 февраля 2019

В вашей функции getMore вы можете использовать свойство fetchOffset в сочетании с fetchLimit, чтобы вы могли создать поддиапазон произвольного набора результатов и избежать повторной загрузки всего содержимого ячейки.

[fetchedResultsController.fetchRequest setFetchOffset: newFetchOffset];

Где newFetchOffset будет начинаться с 0, а по второму запросу вам нужно установить 50, чтобы вы могли получить следующие 50-е значения.

...