Function 如何在Swift中创建具有完成处理程序的函数?

Function 如何在Swift中创建具有完成处理程序的函数?,function,swift,completionhandler,Function,Swift,Completionhandler,我只是好奇我将如何处理这个问题。如果我有一个函数,并且我希望在它完全执行时发生一些事情,我将如何将它添加到函数中?感谢假设您拥有从网络下载文件的下载功能,并希望在下载任务完成时收到通知 typealias CompletionHandler = (success:Bool) -> Void func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) { // download code.

我只是好奇我将如何处理这个问题。如果我有一个函数,并且我希望在它完全执行时发生一些事情,我将如何将它添加到函数中?感谢

假设您拥有从网络下载文件的下载功能,并希望在下载任务完成时收到通知

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

希望有帮助。

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


假设您具有从网络下载文件的下载功能,并且希望在下载任务完成时收到通知

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

您的
//下载代码
仍将异步运行。为什么代码不直接进入您的
let flag=true
完成处理程序(success:flag)
,而不等待下载代码完成

为此,我们可以使用闭包。试试下面的方法

func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
      //some code here
      completionClosure(indexes: list)
}
在某些情况下,我们可以调用下面给出的函数

healthIndexManager.loadHealthCareList { (indexes) -> () in
            print(indexes)
}
有关闭包的更多信息,请参阅以下链接


除上述内容外:可以使用尾随关闭

downloadFileFromURL(NSURL(string: "url_str")!)  { (success) -> Void in

  // When download completes,control flow goes here.
  if success {
      // download success
  } else {
    // download fail
  }
}

我很难理解答案,所以我假设像我这样的初学者也会有和我一样的问题

我的解决方案与上面的答案相同,但希望对初学者或一般理解有困难的人来说更清楚、更容易理解

使用完成处理程序创建函数的步骤

func yourFunctionName(finished: () -> Void) {

     print("Doing something!")

     finished()

}
使用函数

     override func viewDidLoad() {

          yourFunctionName {

          //do something here after running your function
           print("Tada!!!!")
          }

    }
您的输出将是

做某事

多田

希望这有帮助

简单的例子:

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

Swift 5.0+,简单而简短

例如:

风格1

    func methodName(completionBlock: () -> Void)  {

          print("block_Completion")
          completionBlock()
    }
风格2

    func methodName(completionBlock: () -> ())  {

        print("block_Completion")
        completionBlock()
    }
使用:

    override func viewDidLoad() {
        super.viewDidLoad()
        
        methodName {

            print("Doing something after Block_Completion!!")
        }
    }
输出

区块完井

在Block_完成后做点什么


这将非常有效,但更出于好奇,我想知道您是否可以在函数中编写一个完成处理程序。嗨,弗洛克斯,我想从其他函数调用这个完成处理程序,那么如何实现这一点??任何关于目标C的例子,当我用另一个类调用它时,它不是播种完成处理程序成功参数。最终,有些东西必须坐下来等待代码运行,它不是一个巨大的异步大象塔。“异步运行”意味着有两个线程。他们中的一个坐着等待任务完成,另一个继续而不继续。完成处理程序在执行该工作的线程结束时被调用,或者至少被计划调用。Youtube上有一个令人惊叹的视频: