我试图使用swift 4和openWeather API构建一个天气应用程序,但我陷入了此功能:
func fetchWeather(){
let weatherGetter = GetWeather()
self.cityWeather = [Temperature]()
for city in cities {
weatherGetter.getWeather(city: city) { (temp) in
guard let temp = temp else {return}
print(temp)
self.cityWeather?.append(temp)
}
}
print(self.cityWeather?.count)
self.collectionView?.reloadData()
}
因此,此功能可以在控制台中实现
可选(0) 温度(城市:“伦敦”,城市温度:“ 294.06”,温度图标:“ 01d”) 温度(城市:“东京”,城市温度:“ 297.33”,温度图标:“ 09n”) 温度(城市:“巴黎”,城市温度:“ 298.0”,温度图标:“ 01d”) 温度(城市:“莫斯科”,城市温度:“ 291.41”,tempIcon:“ 01n”)
这对我来说真的很奇怪,因为在for循环之后使用了print(self.cityWeather?.count),但是在控制台中Optional(0)首先出现。
因此,如果我使用此方法
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return cityWeather?.count ?? 0
}
我的收藏夹视图单元格不会显示,因为它返回0。
但是如果在self.cityWeather?.append(temp)之后使用print(self.cityWeather),我会得到这个! (我删除的所有其他打印语句):
可选([WhatsWeather.Temperature(城市:“莫斯科”,cityTemperature:“ 291.41”,tempIcon:“ 01n”)])) 可选([WhatsWeather.Temperature(城市:“莫斯科”,cityTemperature:“ 291.41”,tempIcon:“ 01n”),WhatsWeather.Temperature(city:“ London”,cityTemperature:“ 294.05”,tempIcon:“ 01d”)])) 可选([WhatsWeather.Temperature(城市:“莫斯科”,cityTemperature:“ 291.41”,tempIcon:“ 01n”),WhatsWeather.Temperature(城市:“ London”,cityTemperature:“ 294.05”,tempIcon:“ 01d”),WhatsWeather 。温度(city:“ Paris”,cityTemperature:“ 298.0”,tempIcon:“ 01d”)]) 可选([WhatsWeather.Temperature(城市:“莫斯科”,cityTemperature:“ 291.41”,tempIcon:“ 01n”),WhatsWeather.Temperature(城市:“ London”,cityTemperature:“ 294.05”,tempIcon:“ 01d”),WhatsWeather 。温度(城市:“巴黎”,城市温度:“ 298.0”,tempIcon:“ 01d”),WhatsWeather.Temperature(城市:“ Tokyo”,城市温度:“ 297.38”,tempIcon:“ 09n”)))))
答案 0 :(得分:1)
只有在所有城市数据都存储在数据源中之后,才应该重新加载C:\path\to\folder, */folder_name/*
,并且由于这是API调用,因此接收每个响应都需要一些时间。因此,您应该做的是在完成情况中检查是否已收到所有数据,然后重新加载<project>,<current file>,<open files>,<open folders>
。
collectionView
编辑:感谢matt在检查collectionView
和线程问题时指出了逻辑错误。
答案 1 :(得分:0)
那是因为您要在cityWeather
块中附加weatherGetter.getWeather
,这是异步操作并同步重新加载collectionView
(在从服务器取回数据之前)。
尝试一下:
func fetchWeather(){
let weatherGetter = GetWeather()
self.cityWeather = [Temperature]()
for city in cities {
weatherGetter.getWeather(city: city) { (temp) in
guard let temp = temp else {return}
self.cityWeather?.append(temp)
self.collectionView?.reloadData()
}
}
}