Установить данные UITableViewCell из удаленного файла JSON - PullRequest
2 голосов
/ 26 сентября 2011

У меня есть UITableView, представляющий список городов (100 городов).

Для каждого города я хочу позвонить в конкретный удаленный (URL) JSON, чтобы получить информацию о погоде в городе и заполнить данные ответов для каждой ячейки города в UITableView.

Когда я запускаю приложение, я хочу видеть свою таблицу как можно быстрее, поэтому мне не нужно ждать всех ответов json. Я хочу, чтобы информация получалась асинхронно (когда загружается определенный json, установите его для соответствующей ячейки города в UITableView).

Примечание. Для меня важно вызывать отдельные удаленные файлы JSON.


Какая техника лучше всего подходит для этой задачи?

Ответы [ 2 ]

4 голосов
/ 28 сентября 2011

Я бы начал со следующего подхода:

Создайте структуру данных для хранения информации о городе, включая:

  • путь к вашей службе данных,
  • службавызов "состояние" (ожидание, ожидание, завершение, ошибка),
  • информация о погоде (из JSON, возвращенного сервисным вызовом)

Когда вы впервые показываете таблицу, вы захотите:

  • инициализировать ваш массив (из вышеупомянутой структуры данных),
  • инициировать каждый вызов службы асинхронно,
  • установить состояние каждой строки (города) в ожидание.

Возможно, вы также захотите вернуть пользовательский UITableCellView с названием города (если оно у вас уже есть) и индикатор активности вращения.Это будет вашим лучшим вариантом, чтобы иметь быструю загрузку (не ожидая завершения служб) и дать некоторую визуальную индикацию загрузки данных.

Каждый вызов службы должен использовать ViewController в качестве своего делегата;вам понадобится ключевое поле, чтобы при возврате служб они могли определить, с какой строкой / городом они связаны.

Когда каждая служба завершает работу и вызывает делегата, она отправляет данные в ViewController, который(в свою очередь) обновит массив и запустит обновление UITableView.

Обновление UITableView, на мой взгляд, самая сложная часть.Обычно ячейки отрисовываются или обновляются, когда они становятся видимыми;таблица предварительно выбирает геометрию всех видимых ячеек, а затем запрашивает фактическое содержимое, когда она готова нарисовать каждую ячейку;в результате ваша стратегия обновления ячеек будет зависеть от того, как используется ваша таблица.

  • Если геометрия вашей ячейки изменится, вам, скорее всего, потребуется перерисовать всю таблицу;Мне не терпится подумать о том, что будет делать 50 одновременных перерисовок UITableView для вашего приложения, поэтому вам может потребоваться установить временной порог для «чанковых» обновлений и более разумно обрабатывать рисование.[theTableView reloadData] приведет к повторному запросу и перерисовке всей таблицы.

  • Если геометрия вашей ячейки не изменяется, вы можете попытаться более оперативно обновлять только видимые ячейки (невидимые не являются проблемой, так как их данные будут запрашиваться, когда они станут видимыми).[theTableView visibleCells] возвращает массив видимых ячеек;когда ваш сервисный вызов возвращается, вы можете обновить данные и затем выполнить поиск в массиве, чтобы увидеть, видна ли рассматриваемая ячейка;если это так, вам, вероятно, потребуется отправить конкретное сообщение UITableCellView setNeedsDisplay.

Хорошее объяснение setNeedsDisplay, setNeedsLayout и reloadData можно найти по адресуhttp://iosdevelopertips.com/cocoa/understanding-reload-repaint-and-re-layout-for-uitableview.html.

Есть соответствующий вопрос SO на Как обновить UITableViewCell?

Наконец, вы, вероятно, захотите реализовать некоторую логику обновления в подпрограмме ошибки делегата сервисатолько для того, чтобы вы не создавали бесконечно вращающихся индикаторов активности.

2 голосов
/ 04 октября 2011

Я делаю это сейчас при поиске на нескольких серверах.Я использую Core Data, но вы можете использовать NSMutableArray для накопления ваших ответов JSON.

Каждый раз, когда вы заканчиваете получать дату от одного из ваших серверов (например, когда выполняется connectionDidFinishLoading), берите объект данных JSON и добавляйте его в NSMutableArray (назовем его weatherResults ) (добавить его с помощью метода addObject).Вы можете преобразовать JSON в NSDictionary до добавления его в изменяемый массив weatherResults .

Предполагая, что ваши методы делегата источника данных ссылаются на то, что находится в NSMutableArray weatherResults (например, получая число строк из размера массива с помощью [weatherResults count]), вы можете сделать следующее:

После вставки объекта в массив вы можете просто вызвать reloadData в контроллере dataSource.Вы увидите обновление таблицы по мере поступления новых результатов JSON.Результаты должны добавляться в конец таблицы по мере их поступления. Если вы хотите сортировать NSMutableArray каждый раз, когда приходят результаты JSON, вы можете сделать это тоже.

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


Кстати, в этом объяснении я предполагаю, что ответ JSON содержит всю информацию, необходимую вам для заполнения ячейки таблицы.Это может быть не так.Если это не так, вам придется сопоставить ответ с другой имеющейся у вас информацией, такой как список городов, которые представляет ваша программа.

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