加载数据时,如何才能使用封闭来完成?(迅速)

  • 本文关键字:迅速 数据 加载 swift
  • 更新时间 :
  • 英文 :


我慢慢地与封闭式达成协议。这是从以下帖子中获取的:

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)
}

最新更新