我有一个从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()
}
答案 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()
}
}
}