我正在慢慢接近关闭。 这取自以下帖子:
https://medium.com/@stasost/ios-three-ways-to-pass-data-from-model-to-controller-b47cc72a4336
我理解函数定义requestData正在使用一个用完成(数据)调用的闭包:
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)
}
}
虽然我知道在下面的viewDidLoad中调用了requestData,并且将(data:String)传递给requestData,但是在调用完成(数据)时我并没有完全了解它。
完成(数据)是否正在执行关键字“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数据已完成加载。
感谢。
答案 0 :(得分:2)
你知道一个函数可以把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)
}