下拉刷新修改数组值?
Pull-to-refresh modifies array value?
我正在使用 Swift 在 iOS 上进行下拉刷新。
我有一个包含城市名称的数组,cityNames = ["Chicago", "New York City"]
我实施了下拉刷新以从互联网上获取温度数据。因此,每次我触发下拉刷新时,它都会上网并获取 cityNames
数组中每个城市的温度。
这是下拉刷新的代码
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
是一个模型,其中包含城市名称,温度,日出时间,high/low温度。
forwardGeocoding
是一个获取城市地理坐标然后发送请求以获取该城市天气数据的函数。
下拉刷新有效,我遇到的问题是,在我拉动的前 2,3 次,它没有问题。但是随着我拉的次数越来越多,数组会突然变成cityNames = ["Chicago", "Chicago"]
感谢您的帮助,如果您需要更多信息,请告诉我。
更新:
我删除了 weatherDetail.removeAll()
,尝试将相同的数据附加到数组。刷新后打印出"Chicago", "New York City", "Chicago", "Chicago"
。如果我刷新它多次,它会打印出类似 "Chicago", "New York City", "Chicago", "Chicago", "Chicago", "Chicago"
的内容
如果城市名称重复两次,则表示weatherDetail
数组中的信息也重复两次。在打印 cityNames
之前尝试打印 weatherDetail
。如果weatherDetail
重复了两次,那么你应该定位到两次添加相同的Weather
对象的代码并消除它。
出于测试目的,找到每个修改 weatherDetail
的地方,并在这些语句之前放置 weatherDetail.removeAll()
。如果这样可以解决您的问题,请搜索将冗余信息添加到 weatherDetail
.
的代码
使用 enumerate()
和 append()
来做这不是一个好方法,有一个更优雅和防错的方法来实现这个:
let cityNames:[String] = weatherDetail.map { weather -> String in
weather.cityName
}
或者只写:
let cityNames:[String] = weatherDetail.map { [=11=].cityName }
forwardGeocoding 是同步的吗?
weatherDetail 何时获取 set/updated?
在我看来,您似乎遇到了某种同步性问题,可能因延迟而加剧。
我正在使用 Swift 在 iOS 上进行下拉刷新。
我有一个包含城市名称的数组,cityNames = ["Chicago", "New York City"]
我实施了下拉刷新以从互联网上获取温度数据。因此,每次我触发下拉刷新时,它都会上网并获取 cityNames
数组中每个城市的温度。
这是下拉刷新的代码
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
是一个模型,其中包含城市名称,温度,日出时间,high/low温度。
forwardGeocoding
是一个获取城市地理坐标然后发送请求以获取该城市天气数据的函数。
下拉刷新有效,我遇到的问题是,在我拉动的前 2,3 次,它没有问题。但是随着我拉的次数越来越多,数组会突然变成cityNames = ["Chicago", "Chicago"]
感谢您的帮助,如果您需要更多信息,请告诉我。
更新:
我删除了 weatherDetail.removeAll()
,尝试将相同的数据附加到数组。刷新后打印出"Chicago", "New York City", "Chicago", "Chicago"
。如果我刷新它多次,它会打印出类似 "Chicago", "New York City", "Chicago", "Chicago", "Chicago", "Chicago"
如果城市名称重复两次,则表示weatherDetail
数组中的信息也重复两次。在打印 cityNames
之前尝试打印 weatherDetail
。如果weatherDetail
重复了两次,那么你应该定位到两次添加相同的Weather
对象的代码并消除它。
出于测试目的,找到每个修改 weatherDetail
的地方,并在这些语句之前放置 weatherDetail.removeAll()
。如果这样可以解决您的问题,请搜索将冗余信息添加到 weatherDetail
.
使用 enumerate()
和 append()
来做这不是一个好方法,有一个更优雅和防错的方法来实现这个:
let cityNames:[String] = weatherDetail.map { weather -> String in
weather.cityName
}
或者只写:
let cityNames:[String] = weatherDetail.map { [=11=].cityName }
forwardGeocoding 是同步的吗? weatherDetail 何时获取 set/updated?
在我看来,您似乎遇到了某种同步性问题,可能因延迟而加剧。