Проблема с методом делегата scrollViewDidScroll и обновлением пользовательского интерфейса - PullRequest
0 голосов
/ 22 февраля 2011

У меня есть представление прокрутки, и я реализую lazyload с контролем страницыЯ взял образец программы pagecontrol от apple.

Я загружаю 8 миниатюр на каждой странице, а сами миниатюры извлекаются из сети и обновляются в пользовательском интерфейсе.Представления изображений уже присутствуют в пользовательском интерфейсе.В моем методе viewDidScroll я вычисляю номер страницы, а затем обновляю другие страницы выше и ниже, как показано ниже:

BOOL isScrollingDown = verticalScrollView.contentOffset.y > _previousContentOffsetY;

_previousContentOffsetY = verticalScrollView.contentOffset.y;

CGFloat pageHeight = verticalScrollView.frame.size.height;

int scrollingToPageNum = isScrollingDown ? (ceil((verticalScrollView.contentOffset.y - pageHeight) / pageHeight) + 1) : (floor((verticalScrollView.contentOffset.y - pageHeight) / pageHeight) + 1);
int page = floor((verticalScrollView.contentOffset.y - pageHeight / 2) / pageHeight) + 1;

[self loadPage:(page-1)];
[self loadPage:(page)];
[self loadPage:(page+1)];

/* Unloading the pages not seen in the view is done here*/
if (!(isScrollingDown) && scrollingToPageNum >1) {
    [self unloadPages:page-2];
}else {
    [self unloadPages:page+2];
}

Интерфейс пользователя слишком медленный, а пользовательский интерфейс очень плохой.Я хочу знать, как я могу сделать пользовательский интерфейс более отзывчивым.

Некоторые другие вопросы: 1) У меня есть класс, который загружает изображения, и вызывающий класс реализует делегат для класса загрузчика.Как только изображение загружено, вызывается метод делегата для обновления пользовательского интерфейса.Замедляет ли это отзывчивость интерфейса?Как этого можно избежать?2) Каков оптимальный способ осуществления загрузки изображений и обновления пользовательского интерфейса, при котором пользовательский интерфейс перестает отвечать на запросы?

РЕДАКТИРОВАТЬ: я открыт для идей о том, как лучше всего улучшить и внедрить это решение.Я не создаю поток явно, но я использую NSURLConnection в асинхронном режиме, и когда данные извлекаются, вызывается метод делегата для обновления пользовательского интерфейса.

Ответы [ 2 ]

4 голосов
/ 22 февраля 2011

Я думаю, вы могли бы извлечь большую пользу из некоторых методов, использованных в образце Apple LazyTableImages.Хотя он использует табличное представление в качестве примера, эти концепции можно легко применить к представлению с прокруткой.

LazyTableImages

1 голос
/ 23 февраля 2011

Вы вызываете loadPage несколько раз каждый раз, когда вызывается scrollViewDidScroll (по крайней мере, я предполагаю, что вы имеете в виду scrollViewDidScroll).Что делает loadPage?Если он слепо запускает запрос на связь, неудивительно, что ваше приложение сходит с ума - вы будете запрашивать одно и то же много раз параллельно - scrollViewDidScroll будет вызываться для каждого различного смещения, которое вы видитепросмотр прокрутки .

Возможно, вам следует подумать об использовании более подходящего метода делегата, такого как scrollViewDidEndDecelerating: для организации вещей.Ответ Марка Адама также очень хороший совет.

Этот вопрос и ответ также объясняют ту же проблему:

Мое приложение вызывает scrollViewDidScroll 19 раз

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