Swift-功能在任务完成之前完成

问题描述 投票:0回答:2

此代码的目的是,当您双击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,然后...

swift xcode multithreading asynchronous task
2个回答
1
投票

您应该等待api调用完成,然后更新UI。睡觉对你没有帮助。您可以将UI更新部分作为完成块(闭包)传递给api调用函数,并在调用完成后调用它。您可能最终得到类似于以下的代码。


0
投票

您需要在callAPI

© www.soinside.com 2019 - 2024. All rights reserved.