gpt4 book ai didi

ios - 函数不从闭包返回值

转载 作者:行者123 更新时间:2023-11-28 09:39:00 26 4
gpt4 key购买 nike

我需要从一个包含闭包的函数返回一个值。

我研究了闭包的返回值,发现我应该使用“完成处理程序”来获得我想要的结果。

我在这里看到了帖子和解释它的文章,但无法申请,因为我没有找到与我的问题相匹配的内容。

class ViewController: UIViewController {

let urls = URLs()

override func viewDidLoad() {
super.viewDidLoad()

var leagueId = getLeagueId(country: "brazil", season: "2019")
print(leagueId) //PRINTING 0

}

func getLeagueId (country: String, season: String) -> Int {

let headers = Headers().getHeaders()
var leagueId = 0
let url = urls.getLeagueUrlByCountryAndSeason(country: country, season: season)


Alamofire.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).responseJSON {
response in
if response.result.isSuccess {
let leagueJSON: JSON = JSON(response.result.value!)
leagueId = (leagueJSON["api"]["leagues"][0]["league_id"].intValue)

}
else {
print("error")
}
}
return leagueId
}
}

返回值始终为 0,因为闭包值未传递给函数本身。

非常感谢

最佳答案

所以您遇到此问题的原因是因为 AlamoFire.request 是异步的。异步与同步有很好的解释 here但基本上,当您异步执行某些操作时,编译器不会等待任务完成后再继续执行下一个任务,而是会立即执行下一个任务。

所以在你的情况下,AlamoFire.request 被执行,并且在它运行时, block 后的下一行立即运行,这是返回 leagueId 的行,它显然仍然等于零,因为 AlamoFire.request 任务(功能)尚未完成。

这就是您需要使用闭包的原因。在 AlamoFire.request(或与此相关的任何其他异步任务)完成运行后,闭包将允许您返回值。上面 Manav 的回答向您展示了在 Swift 中执行此操作的正确方法。我只是想帮助您理解为什么这是必要的。

希望这能有所帮助!

编辑:

上面 Manav 的回答实际上是部分正确的。以下是您如何制作它,以便您可以以正确的方式重用该值。

var myLeagueId = 0;
getLeagueId(country: "brazil", season: "2019",success: { (leagueId) in

// leagueId is the value returned from the closure
myLeagueId = leagueId
print(myLeagueId)
})

下面的代码将无法运行,因为它将 myLeagueId 设置为 getLeagueId 的返回值,而 getLeagueId 没有返回值,因此它甚至无法编译。

myLeagueId = getLeagueId(country: "brazil", season: "2019",success: { (leagueId) in
print(leagueId)
})

关于ios - 函数不从闭包返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57252471/

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