此代码的目的是,当您双击MapKit视图时,它将在地图上放置一个图钉并获取经度和纬度坐标。当它放下引脚时,我希望它调用API并让该API返回城市名称。我想通过在地图视图上放置标签来显示此城市名称,只要您放置新的图钉,标签就会更新。当引脚掉线时,此函数称为:
func previewDataOnButton(){
print("PreviewDataOnButton Called")
theWeatherDataModel.callAPI(latitude: latitude!, longitude: longitude!)
cityStateLabel.text = theWeatherDataModel.cityName
print("PreviewDataOnButton Finished")
}
此函数在视图控制器中,它在单独的模型中调用一个函数。该函数的调用如下所示:
func callAPI(latitude: String, longitude: String){
let baseURL = "https://api.weatherbit.io/v2.0/current?&lat=\(latitude)&lon=\(longitude)&key=\(apiKey)"
let urlComponents = URLComponents(string: baseURL)
let theURL = urlComponents?.url
let session = URLSession(configuration: .ephemeral)
let theTask = session.dataTask(with: theURL!) {
(data, response, error) in
if let actualError = error{
print("We got an error")
} else if let actualData = data, let actualResponse = response{
print("We got stuff back")
let parsedData = try? JSON(data: actualData)
//print("Data: \n\(String(describing: parsedData))")
if let theWeatherArray = parsedData?["data"]{
for(_, singleWeatherDictionary) in theWeatherArray{
self.cityName = singleWeatherDictionary["city_name"].string
}
}
} else {
print("How did I get here?")
}
print("Im done with the closure")
}
print("About to start the data task")
theTask.resume()
print("Started data task")
}
我在整个代码中放置了打印语句以进行调试,并打印了此内容:
已调用PreviewDataOnButton
关于开始数据任务
开始的数据任务
PreviewDataOnButton已完成
我们回来了]
我完成了关闭操作
从输出来看,在模型中的函数可以完成其任务并调用模型之前,视图控制器中的函数似乎已完成。这会导致视图上的标签无法正确使用正确的城市名称进行更新,因为该函数在API实际获得城市名称之前便已完成。这是我遇到的问题,我们将不胜感激。
此代码的目的是,当您双击MapKit视图时,它将在地图上放置一个图钉并获取经度和纬度坐标。当它掉下引脚时,我希望它调用API,然后...
您应该等待api调用完成,然后更新UI。睡觉对你没有帮助。您可以将UI更新部分作为完成块(闭包)传递给api调用函数,并在调用完成后调用它。您可能最终得到类似于以下的代码。
您需要在callAPI