我怎么能在Swift中使用完成处理程序创build一个函数?

我只是好奇,我怎么会这样做。 如果我有一个函数,并且当它被完全执行的时候我想要发生什么,那么我怎么把这个添加到函数中呢? 谢谢

假设您有下载function从networking上下载文件,并希望在下载任务完成时得到通知。

typealias CompletionHandler = (success:Bool) -> Void func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) { // download code. let flag = true // true if download succeed,false otherwise completionHandler(success: flag) } // How to use it. downloadFileFromURL(NSURL(string: "url_str")!, { (success) -> Void in // When download completes,control flow goes here. if success { // download success } else { // download fail } }) 

希望能帮助到你。 : – ]

我很难理解答案,所以我假设像我这样的其他初学者可能会有与我一样的问题。

我的解决scheme和最好的答案一样,但是对于初学者或者一般理解困难的人来说,希望更清楚一些。

用完成处理程序创build一个函数

 func yourFunctionName(finished: () -> Void) { print("Doing something!") finished() } 

使用该function

  override func viewDidLoad() { yourFunctionName { //do something here after running your function print("Tada!!!!") } } 

你的输出将是

 Doing something Tada!!! 

希望这可以帮助!

简单的Swift 4.0例子:

 func method(arg: Bool, completion: (Bool) -> ()) { print("First line of code executed") // do stuff here to determine what you want to "send back". // we are just sending the Boolean value that was sent in "back" completion(arg) } 

如何使用它:

 method(arg: true, completion: { (success) -> Void in print("Second line of code executed") if success { // this will be equal to whatever value is set in this method call print("true") } else { print("false") } }) 

为此我们可以使用闭包 。 尝试以下

 func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) { //some code here completionClosure(indexes: list) } 

在某些时候,我们可以调用这个函数,如下所示。

 healthIndexManager.loadHealthCareList { (indexes) -> () in print(indexes) } 

请参阅以下链接了解更多关于闭包的信息。

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

我对定制的完成处理程序有点困惑。 在你的例子中:

假设您有下载function从networking上下载文件,并希望在下载任务完成时得到通知。

 typealias CompletionHandler = (success:Bool) -> Void func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) { // download code. let flag = true // true if download succeed,false otherwise completionHandler(success: flag) } 

你的// download code仍然会asynchronous运行。 为什么代码不会直接等待你的下载代码完成而直接让你的let flag = truecompletion Handler(success: flag)

除以上之外:可以使用尾随闭合

 downloadFileFromURL(NSURL(string: "url_str")!) { (success) -> Void in // When download completes,control flow goes here. if success { // download success } else { // download fail } }