Как загрузить огромное количество данных из веб-службы в UITableView? - PullRequest
4 голосов
/ 15 марта 2012

В настоящее время я создаю приложение, которое будет иметь UITableView, который будет получать данные из веб-службы.Возвращенные данные могут содержать большое количество записей, например 50 000 записей.Я знаю, что все записи не могут быть загружены в массив одновременно, это сделает приложение нереагирующим из-за нехватки памяти.Веб-сервис, который я вызываю, получает параметры для размера страницы и номера страницы, поэтому он возвращает только те данные, которые я хочу показать пользователю.Но я не нашел ни одного метода, который бы указывал мне, что пользователь прокрутил все отображаемые записи и должен получить новые данные из сервиса.На экране также есть панель поиска и кнопка поиска, которая при нажатии вызывает другую службу, которая возвращает результат поиска.Это будет иметь ту же проблему, что и раньше, так как результат может принести много записей тоже.

Каков будет лучший способ сделать это?

Ответы [ 2 ]

8 голосов
/ 15 марта 2012

Хорошо, есть несколько подходов к этой проблеме.Очень популярной является реализация three20 framework (интернет-контроллеры табличного представления)

Что касается вашего второго вопроса, у делегата tableview есть удобный метод:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

ОБНОВЛЕНИЕ:

После ровно через год после публикации этого ответа я бы порекомендовал вам использовать RestKit .Многие люди думают, что у него крутая кривая обучения, но это действительно отличная структура для обработки спокойных ресурсов и включает в себя управление кэшем, интеграцию / отображение основных данных и разбивку страниц (среди прочих), которые в значительной степени покрывают все ваши требования.

3 голосов
/ 15 марта 2012

В настоящее время мы делаем нечто подобное в нашем приложении. Поскольку UITableView наследуется от UIScrollView, вы, вероятно, захотите воспользоваться некоторыми свойствами и методами UIScrollView. Вы почти наверняка захотите реализовать класс, соответствующий делегату UIScrollView. Затем, когда пользователь прокручивает до конца загруженные в данный момент записи в UITableView, вы можете запросить у веб-службы следующую страницу данных. Документация для UIScrollView здесь и документация для UIScrollViewDelegate здесь .

Вот пример реализации метода scrollViewDidScroll: UIScrollViewDelegate, который должен дать вам поведение при загрузке записей, когда пользователь достигает нижней части представления прокрутки.

- (void) scrollViewDidScroll:(UIScrollView *) scrollView {
    // Calculate whether the user has reached the bottom of the scroll view.
    CGPoint offset = scrollView.contentOffset;
    CGRect bounds = scrollView.bounds;
    CGSize size = scrollView.contentSize;
    UIEdgeInsets inset = scrollView.contentInset;
    float y = offset.y + bounds.size.height - inset.bottom;
    float h = size.height;
    float reload_distance = 0;
    if (y >= h + reload_distance) {
        // Request next page of data here.
    }
}

Прелесть методов UITableViewDataSource в том, что они не требуют, чтобы ваши данные хранились в памяти. Вы можете предоставить необходимые данные для каждой ячейки, запрашиваемой по требованию при вызове tableView:cellForRowAtIndexPath:. Точно так же вы можете предоставить значение для возврата из tableView:numberOfRowsInSection:, фактически не имея всех данных для строк в памяти. Скорее всего, вы захотите сохранить данные для ячеек вокруг просматриваемых в настоящее время ячеек в памяти, чтобы обеспечить разумную производительность. К сожалению, все это может быть довольно сложно, но это должно быть возможно. Вы можете найти больше документации о UITableDataSource здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...