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 7

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.