Я бы начал со следующего подхода:
Создайте структуру данных для хранения информации о городе, включая:
- путь к вашей службе данных,
- службавызов "состояние" (ожидание, ожидание, завершение, ошибка),
- информация о погоде (из 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?
Наконец, вы, вероятно, захотите реализовать некоторую логику обновления в подпрограмме ошибки делегата сервисатолько для того, чтобы вы не создавали бесконечно вращающихся индикаторов активности.