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

时间:2018-02-17 01:53:25

标签: 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: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数据已完成加载。

感谢。

1 个答案:

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