如何在Swift中创建一个带有完成处理程序的函数?

uqjltbpv  于 2022-12-26  发布在  Swift
关注(0)|答案(8)|浏览(120)

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

1zmg4dgp

1zmg4dgp1#

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

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

efzxgjgh2#

我很难理解答案,所以我想任何其他像我这样的初学者可能会有同样的问题。
我的解决方案和上面的答案一样,但希望对初学者或一般理解有困难的人来说更清楚和容易理解。
创建具有完成处理程序的函数

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

     print("Doing something!")

     finished()

}

要使用该函数

override func viewDidLoad() {
    
          yourFunctionName {
         
          //do something here after running your function
           print("Tada!!!!")
          }
    
    }

您的输出将为
做点什么
哒哒!!!

vlurs2pr

vlurs2pr3#

简单示例:

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

ctehm74n4#

    • 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_完成
在Block_Completion之后执行某些操作!!

neskvpey

neskvpey5#

为此,我们可以使用闭包。请尝试以下操作

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

ryoqjall

ryoqjall6#

除上述内容外:可使用尾部封口

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

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

gtlvzcf87#

我对定制的完成处理程序有点困惑。在你的例子中:
假设你有一个下载功能,可以从网络下载一个文件,并且希望在下载任务完成时得到通知。

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),而不等待您的下载代码完成?

ih99xse1

ih99xse18#

//MARK: - Define
typealias Completion = (_ success:Bool) -> Void
//MARK: - Create
func Call(url: NSURL, Completion: Completion) {
      Completion(true)
}
//MARK: - Use
Call(url: NSURL(string: "http://")!, Completion: { (success) -> Void in
    if success {
        //TRUE
    } else {
        //FALSE
    }
})

相关问题