我怎么能在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) }
请参阅以下链接了解更多关于闭包的信息。
我对定制的完成处理程序有点困惑。 在你的例子中:
假设您有下载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 = true
和completion 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 } }