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