如何在Swift中使用完成处理程序创建一个函数?

时间:2015-05-22 16:13:46

标签: function swift completionhandler

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

7 个答案:

答案 0 :(得分:143)

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

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

希望它有所帮助。 : - ]

答案 1 :(得分:63)

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

答案 2 :(得分:58)

我无法理解答案,所以我假设像我这样的任何其他初学者都可能遇到与我相同的问题。

我的解决方案与最佳答案的解决方案相同,但希望对初学者或一般情况下难以理解的人更加清晰易懂。

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

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

     print("Doing something!")

     finished()

}

使用功能

     override func viewDidLoad() {

          yourFunctionName {

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

    }

您的输出将是

Doing something
Tada!!!

希望这有帮助!

答案 3 :(得分:11)

我们可以使用 Closures 来实现此目的。请尝试以下

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

答案 4 :(得分:1)

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

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

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仍将以异步方式运行。为什么代码不会直接发送到let flag = truecompletion Handler(success: flag)而不等待下载代码完成?

答案 5 :(得分:0)

除上述之外:尾随关闭可以使用。

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

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

答案 6 :(得分:0)

Swift 5.0 +,简单又简短

示例:

样式1

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

          print("block_Completion")
    }

样式2

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

        print("block_Completion")
    }

使用:

    override func viewDidLoad() {
        super.viewDidLoad()

        methodName {

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

输出

  

block_Completion

     

在Block_Completion之后做点什么!