Пользовательский интерфейс приложения не отвечает некоторое время, а затем возобновляет нормальное функционирование и проблемы с UIScrollView - PullRequest
1 голос
/ 10 февраля 2011

Я постараюсь изложить проблему простыми словами. Я довольно новичок в программировании для iOS. Я разрабатываю приложение, которое получает ответ на основе XML от сервера. Приложение состоит из 4 вкладок, которые вызывают другой запрос, и все ответы основаны на xml.

Сценарий проблемы: Предположим, я нажимаю первую вкладку, на которую отправляется запрос на первый набор данных. В обычном сценарии я анализирую ответ и отображаю его на экране. Экран состоит из UIScrollView, и я добавляю подпредставления, чтобы он выглядел как сетка изображений. Я запрашиваю изображения при создании вида сетки. URL для изображений являются частью ответа. Опять же, это асинхронный запрос и обновление вида сетки на основе индекса. Это работает нормально, если я не нажимаю никакую другую вкладку в течение всего процесса обновления. Предположим, я нажимаю другую вкладку, после чего также запускается запрос к серверу.

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

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

Во время этого процесса пользовательский интерфейс становится полностью не отвечающим. Я не хочу иметь неотзывчивый интерфейс.

  1. Как мне эффективно это сделать без необходимости загружать содержимое дважды?
  2. Может ли быть лучший подход для достижения этого?

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

Я создаю 100 подпредставлений и добавляю их в представление прокрутки. В течение этого времени я не могу прокрутить, и, следовательно, это дает ощущение зависания. Как я могу обновить представление UIscroll без компромисса в отзывчивости?

1 Ответ

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

Я пишу приложение, которое интенсивно использует веб-сервис для предоставления данных для отображения на экране. Я делаю все загрузки в NSOperation, который выполняется внутри NSOperationQueue одноэлементного класса «менеджер данных». NSOperation выполняет «executeSelectorOnMainThread» в одноэлементном диспетчере данных, когда загрузка завершена, менеджер данных сохраняет новые данные и отправляет NSNotification, что у него есть новые доступные данные. Любой UIViewController, который заботится об обновлениях данных в этом конкретном диспетчере, регистрируется для этого уведомления об обновлении.

При такой структуре пользовательский интерфейс приложения работает очень плавно, без сбоев и остановок.

Используя такую ​​же организацию, очень легко создать класс "LazyUIImageView", который загружает свой образ в NSOperation (и может показывать индикатор активности в ожидании завершения загрузки изображения). Таблицы с LazyUIImageView плавно прокручиваются, и когда данные об изображениях, наконец, поступают, изображения просто «всплывают» прямо для просмотра.

...