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


Answers:


174

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

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

希望能帮助到你。


2
这会很好,但是出于好奇,我想知道您是否可以以某种方式将完成处理程序写入函数中。
traw1233

1
嗨,Floks,我想从其他函数中调用此CompletionHandler,那么如何实现呢?
Himanshu jamnani

目标c的任何示例
Xcodian Solangi

当我由另一个类调用它时,它不会播种完成处理程序成功参数。
Chandni

85

我在理解答案时遇到了麻烦,因此我假设像我这样的其他初学者可能也有与我相同的问题。

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

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

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

     print("Doing something!")

     finished()

}

使用功能

     override func viewDidLoad() {

          yourFunctionName {

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

    }

您的输出将是

做某事

多田

希望这可以帮助!


80

简单的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")
    }
})

12

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

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


5

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_Completion

在Block_Completion之后做点什么!


0

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

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

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)又不等待下载代码完成?


最终,必须坐下来等待代码运行,这并不是一路巨大的异步大象之塔。“异步运行”表示有两个线程。其中一个坐着等待任务完成,另一个坐着而不走。在完成工作的线程的末尾,完成处理程序被调用,或者至少被调度为被调用。
Crowman'1

0

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

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

  // When download completes,control flow goes here.
  if success {
      // download success
  } else {
    // download fail
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.