gpt4 book ai didi

ios - 修改全局变量内部闭包(Swift 4)

转载 作者:行者123 更新时间:2023-11-28 07:58:36 25 4
gpt4 key购买 nike

我正在尝试使用此函数修改全局变量 currentWeather(CurrentWeather 类型),这意味着使用从 URL 检索到的信息更新所述变量并返回表示其成功的 bool 值。但是,该函数返回 false,因为 currentWeather 仍然为 nil。我认识到 dataTask 是异步的,并且该任务在后台与应用程序并行运行,但我不明白这对我要完成的工作意味着什么。我也无法在 do block 之后更新 currentWeather,因为在退出 block 后不再识别天气。我确实尝试使用“self.currentWeather”,但被告知这是一个未解析的标识符(可能是因为该函数也是全局的,并且没有“self”?)。

该 URL 当前无效,因为我取出了我的 API key ,但它按预期工作,并且我的 CurrentWeather 结构是可解码的。打印 currentWeatherUnwrapped 也一直是成功的。

我确实查看了 Stack Overflow 和 Apple 的官方文档,但未能找到可以回答我问题的内容,但也许我还不够彻底。如果这是一个重复的问题,我很抱歉。也感谢任何进一步相关阅读的指导!对于不符合最佳编码实践,我深表歉意——我在这一点上不是很有经验。非常感谢大家!

func getCurrentWeather () -> Bool {
let jsonUrlString = "https://api.wunderground.com/api/KEY/conditions/q/\(state)/\(city).json"

guard let url = URL(string: jsonUrlString) else { return false }

URLSession.shared.dataTask(with: url) { (data, response, err) in
// check error/response

guard let data = data else { return }

do {
let weather = try JSONDecoder().decode(CurrentWeather.self, from: data)
currentWeather = weather
if let currentWeatherUnwrapped = currentWeather {
print(currentWeatherUnwrapped)
}
} catch let jsonErr {
print("Error serializing JSON: ", jsonErr)
}

// cannot update currentWeather here, as weather is local to do block

}.resume()

return currentWeather != nil
}

最佳答案

当您执行这样的异步调用时,您的函数将在您的 dataTask 返回任何值之前很久就返回。您需要做的是在函数中使用完成处理程序。您可以像这样将其作为参数传递:

func getCurrentWeather(completion: @escaping(CurrentWeather?, Error?) -> Void) {
//Data task and such here
let jsonUrlString = "https://api.wunderground.com/api/KEY/conditions/q/\(state)/\(city).json"

guard let url = URL(string: jsonUrlString) else { return false }

URLSession.shared.dataTask(with: url) { (data, response, err) in
// check error/response

guard let data = data else {
completion(nil, err)
return
}

//You don't need a do try catch if you use try?
let weather = try? JSONDecoder().decode(CurrentWeather.self, from: data)
completion(weather, err)
}.resume()

}

然后调用该函数如下所示:

getCurrentWeather(completion: { (weather, error) in
guard error == nil, let weather = weather else {
if weather == nil { print("No Weather") }
if error != nil { print(error!.localizedDescription) }
return
}
//Do something with your weather result
print(weather)
})

关于ios - 修改全局变量内部闭包(Swift 4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47272694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com