Swift 数组中设置数据后为空

Swift 数组中设置数据后为空,swift,Swift,我有一个JSON请求,它从Darksky API获取数据,我正确地获取了数据,并显示在屏幕上。但是,当我试图从另一个数组中的JSON调用获取的数组中设置数据时,它将保持为空。 这是我的代码: 仅声明数组: var mForecastArray = [Weather]() 这是调用API的函数: func getForecast(){ Weather.forecast(withLocation: "37.8267,-122.4233") { (arr) in Dispat

我有一个JSON请求,它从Darksky API获取数据,我正确地获取了数据,并显示在屏幕上。但是,当我试图从另一个数组中的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()
    }
这是一种视觉错觉

静态方法
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()
        }
    }
}

您究竟在哪里看到了
nil
,哪个属性/变量是
nil
?mForecastArray是nil。我仍然不熟悉队列,但可能是因为我在DispatchQueue的mForecastArray中设置了数据,所以可能它就在那里设置了数据,并在数据离开队列后删除了数据?我希望你能理解我的意思,英语不是我的母语,我很难正确地表达。但是你什么时候/在哪里看到
mforecastary
nil
?您是否已验证您的
forecast
方法是否达到
completion(forecastArray)
行?例如,我尝试打印它,它只打印“[]”。它确实完成了,出于某种原因,它正在工作,我确实从DarkSky API获得了天气对象数组。但是您在哪里/何时打印
mForecastArray
?非常感谢!我在哪里可以了解更多关于异步的信息?我需要在代码中的其他地方使用数组,但它似乎是空的,所以我无法使用。URLSession的所有
任务
都是异步运行的。数据在完成处理程序中有效。将依赖于数组的代码也移动到完成处理程序中,或使用自己的完成处理程序声明
getForecast