Pull-to-refresh изменяет значение массива?
Я работаю над pull-to-refresh на iOS с помощью Swift.
У меня есть массив с названиями городов, cityNames = ["Chicago", "New York City"]
Я реализовал функцию pull-to-refresh для получения данных о температуре из интернета. Поэтому каждый раз, когда я запускаю pull-to-refresh, он будет выходить в интернет и получать температуру для каждого города в массиве cityNames
.
Вот код для pull-to-refresh
var weatherDetail = [Weather]()
// Pull to refresh
func refreshData() {
var cityNames = [String]()
for (index, _) in weatherDetail.enumerate() {
let info = weatherDetail[index]
cityNames.append(info.cityName)
}
print(cityNames)
weatherDetail.removeAll()
for city in cityNames {
self.forwardGeocoding(city)
}
weatherCityTable.reloadData()
refreshControl.endRefreshing()
}
В приведенном выше коде weatherDetail
- это массив модели(я не знаю, как это сформулировать, но Weather
- это модель, которая содержит названия городов, температуру, время восхода солнца, высокую / низкую температуру.forwardGeocoding
это функция, которая получает географическую координацию для города, а затем отправляет запрос на получение данных о погоде для этого города.
Тяга к обновлению работает, проблема, с которой я сталкиваюсь, заключается в том, что в первые 2,3 раза, когда я тяну, она работает без проблем. Но как только я потяну больше раз, массив внезапно изменится на cityNames = ["Chicago", "Chicago"]
Спасибо за вашу помощь, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Обновление:
Я удалено weatherDetail.removeAll()
, попробуйте просто добавить те же данные в массив. После обновления он распечатывает "Chicago", "New York City", "Chicago", "Chicago"
. Если я обновлю его еще раз, он выведет что-то вроде "Chicago", "New York City", "Chicago", "Chicago", "Chicago", "Chicago"
3 ответа:
Является ли форвардгеокодирование синхронным? Когда weatherDetail устанавливается / обновляется?
Мне кажется, что у вас здесь какая-то проблема с синхронностью, вероятно, усугубленная задержкой.
Использование
enumerate()
иappend()
для этого не является хорошим подходом ,есть более элегантный и безошибочный способ достичь этого:let cityNames:[String] = weatherDetail.map { weather -> String in weather.cityName }
Или просто напишите:
let cityNames:[String] = weatherDetail.map { $0.cityName }
Если названия городов повторяются дважды, это означает, что информация в массиве
weatherDetail
также повторяется дважды. Попробуйте напечататьweatherDetail
перед печатьюcityNames
. ЕслиweatherDetail
повторяется дважды, то следует найти код, который дважды добавляет одни и те же объектыWeather
, и исключить его.Для целей тестирования найдите каждое место, которое изменяет
weatherDetail
, и перед этими утверждениями поместитеweatherDetail.removeAll()
. Если это устраняет вашу проблему, то найдите код, который добавляет избыточную информацию вweatherDetail
.