我慢慢地与封闭式达成协议。这是从以下帖子中获取的:
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中,我不太了解完成(数据(时正在完成的操作。
是否完成(数据(执行关键字"?
之后发生的代码{ [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
是a 函数 - 一个采用一个参数的函数,称为 data
。
当您收到参数功能时,您该怎么办?与此有关的一件明显的事情是 call it:
func requestData(completion: ((data: String) -> Void)) {
completion(data: "well howdy there")
}
仍然只是谈论传递所需函数 to requestData
的语法作为其completion
参数。这是一种方法:
func output(data: String) {
print(data)
}
requestData(completion:output)
这是一种更好的方式,避免给传递功能的名称避免使用:
requestData(completion:{
data in
print(data)
})
最后,由于 completion
是唯一的参数,因此我们可以使用" tablect closure"语法 - 我们删除了 completion:
标签和呼叫的括号:
requestData {
data in
print(data)
}