我正在使用Swift进行iOS上的pull-to-refresh工作
我有一个城市名称为cityNames = ["Chicago", "New York City"]
的数组
我实现了一个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"
答案 0 :(得分:5)
forwardGeocoding是同步的吗? weatherDetail什么时候设置/更新?
在我看来,你在这里遇到某种同步性问题,可能因延迟而加剧。
答案 1 :(得分:4)
使用enumerate()
和append()
执行此操作不是一个好方法,有一种更优雅,更防错的方法来实现这一目标:
let cityNames:[String] = weatherDetail.map { weather -> String in
weather.cityName
}
或者只写:
let cityNames:[String] = weatherDetail.map { $0.cityName }
答案 2 :(得分:3)
如果城市名称重复两次,则表示weatherDetail
数组中的信息也会重复两次。在打印weatherDetail
之前尝试打印cityNames
。如果weatherDetail
重复两次,那么您应该找到两次添加相同Weather
个对象的代码并将其消除。
出于测试目的,找到修改weatherDetail
的每个地方,然后在这些语句放置weatherDetail.removeAll()
之前。如果这样可以解决您的问题,那么请搜索将冗余信息添加到weatherDetail
的代码。