【问题标题】:How could I create a function with a completion handler in Swift?如何在 Swift 中创建带有完成处理程序的函数?
【发布时间】:2015-08-04 18:09:07
【问题描述】:

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

【问题讨论】:

  • Youtube 上有一段很棒的视频:google.com/…
  • @Bright,视频不可用...

标签: function swift completionhandler


【解决方案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)
}

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

希望对你有帮助。

【讨论】:

  • 这会很好,但出于好奇,我想知道您是否可以以某种方式将完成处理程序写入您的函数。
  • 嗨,Floks,我想从其他函数调用这个 CompletionHandler 那么如何实现呢??
  • 目标 c 的任何示例
  • 当我被另一个类调用它时,它没有播种完成处理程序成功参数。
【解决方案2】:

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

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

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

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

     print("Doing something!")

     finished()

}

使用功能

     override func viewDidLoad() {

          yourFunctionName {

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

    }

你的输出将是

做某事

多田!!!

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    简单示例:

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

    【讨论】:

      【解决方案4】:

      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 之后做点什么!!

      【讨论】:

        【解决方案5】:

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

        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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

            假设你有一个下载功能,可以从网络下载文件,并希望在下载任务完成时收到通知。

            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 = true 和completion Handler(success: flag)?

            【讨论】:

            • 最终,必须坐下来等待代码运行,而不是一路向下的异步大象巨塔。 “异步运行”意味着有两个线程。其中一个坐下来等待任务完成,另一个继续并没有。完成处理程序在完成工作的线程结束时被调用,或者至少被调度调用。
            猜你喜欢
            • 1970-01-01
            • 2014-10-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多