在数组中设置数据后为空

时间:2018-12-17 16:23:18

标签: swift

我有一个从Darksky API获取数据的JSON请求,我正确获取了数据,并显示在屏幕上。但是,当我尝试从另一个数组中的JSON调用获取的数组中设置数据时,它保持为空。 这是我的代码:

只声明数组:

var mForecastArray = [Weather]()

这是调用API的函数:

func getForecast(){
    Weather.forecast(withLocation: "37.8267,-122.4233") { (arr) in
        DispatchQueue.main.async {
            self.mForecastArray = arr
            self.mTodayWeather = arr[0]
            self.mCollectionView.reloadData()
        }
    }
}

奇怪的是,它确实起作用,并且数据确实在屏幕上显示,但是mForecastArray似乎为空。

这是API调用本身:

static func forecast(withLocation location: String, completion: @escaping ([Weather]) -> ()){
        let url = basePath + location
        let request = URLRequest(url: URL(string: url)!)

        let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in

            var forecastArray: [Weather] = []
            if let data = data{
                do{
                    if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Any]{
                        if let dailyForecast = json["daily"] as? [String:Any]{
                            if let dailyData = dailyForecast["data"] as? [[String:Any]]{
                                for dataPoint in dailyData{
                                    if let weatherObject = try? Weather(json: dataPoint){
                                        forecastArray.append(weatherObject)
                                    }
                                }
                            }
                        }
                    }
                }catch{
                    print(error.localizedDescription)
                }
                completion(forecastArray)
            }
        }
        task.resume()
    }

1 个答案:

答案 0 :(得分:1)

这是 visual 异步错觉。

静态方法forecast异步工作。

您的代码很可能看起来像

getForecast()
print(self.mForecastArray)

这不起作用,因为该数组是在稍后填充的。

print行移到静态方法的完成处理程序中

func getForecast(){
    Weather.forecast(withLocation: "37.8267,-122.4233") { (arr) in
        DispatchQueue.main.async {
            self.mForecastArray = arr
            print(self.mForecastArray)
            self.mTodayWeather = arr[0]
            self.mCollectionView.reloadData()
        }
    }
}