Pull-to-refresh修改数组值?

时间:2016-04-03 19:31:20

标签: ios arrays swift uitableview pull-to-refresh

我正在使用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"

的内容

3 个答案:

答案 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的代码。