gpt4 book ai didi

swift - 如何使用闭包仅在加载数据时完成? ( swift )

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

我正在慢慢接受关闭。这取自以下帖子:

https://medium.com/@stasost/ios-three-ways-to-pass-data-from-model-to-controller-b47cc72a4336

我理解函数定义 requestData 正在接受一个用 completion(data) 调用的闭包:

    class DataModel {
func requestData(completion: ((data: String) -> Void)) {
// the data was received and parsed to String
let data = "Data from wherever"
completion(data)
}

}


class ViewController: UIViewController {
private let dataModel = DataModel()
override func viewDidLoad() {
super.viewDidLoad()
dataModel.requestData { [weak self] (data: String) in
self?.useData(data: data)
}
}
private func useData(data: String) {
print(data)
}
}

虽然我知道 requestData 在下面的 viewDidLoad 中被调用,并且 (data:String) 被传递到 requestData,但我不太明白调用 completion(data) 时正在做什么。

completion(data) 是否执行关键字“in”之后发生的代码?

{ [weak self] (data: String) in
self?.useData(data: data)
}

我对事情发生的顺序有疑问。是吗:

a) let data = "Data from wherever"
b) completion(data)
c) self?.useData(data: data)

在我正在处理的当前应用程序中,当用户启动应用程序时,我会调用 api 来加载数据。但我仍然有点不确定如何告诉 ViewController 数据已完成加载。

谢谢。

最佳答案

你明白一个函数可以接受,比方说,一个 Int 作为参数吗?

func f(_ i:Int) { 
// do something with i
}

好吧,一个函数也可以将一个函数作为参数:

func requestData(completion: ((data: String) -> Void)) {
// do something with completion
}

在该声明中,completion 是一个函数 — 一个接受一个参数的函数,称为 data

当你接收到一个函数作为参数时,你能做什么?一个显而易见的事情是调用它:

func requestData(completion: ((data: String) -> Void)) {
completion(data: "well howdy there")
}

剩下的只是讨论将所需函数传递给 requestData 作为其completion 参数的语法。这是一种方法:

func output(data: String) {
print(data)
}
requestData(completion:output)

这是一个更好的方法,它避免给传递的函数命名:

requestData(completion:{
data in
print(data)
})

最后,由于 completion 是唯一的参数,我们可以使用“尾随闭包”语法——我们删除 completion: 标签和调用的括号:

requestData {
data in
print(data)
}

关于swift - 如何使用闭包仅在加载数据时完成? ( swift ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48837163/

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