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

我只是好奇我该怎么处理这件事。如果我有一个函数,我希望在它完全执行时发生一些事情,我应该如何将它添加到函数中呢?谢谢

173472 次浏览

假设您有一个从网络下载文件的下载函数,并且希望在下载任务完成时得到通知。

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

您的 // download code仍将异步运行。为什么代码不直接进入您的 let flag = truecompletion Handler(success: flag)而不等待您的下载代码完成?

我们可以为此使用 关闭

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

除了以上: 尾部封闭可以使用。

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 + ,简单明了

例如:

风格一

    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 之后做一些事情! !

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