iOS中的集合视图

时间:2018-08-08 18:29:04

标签: swift xcode dictionary uicollectionview

我试图使用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”)))))

2 个答案:

答案 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()
        }
    }
}