我如何在 Swift 中创建带有完成处理程序的函数?
How could I create a function with a completion handler in Swift?
我很好奇我将如何处理这个问题。如果我有一个函数,并且我希望在它完全执行时发生某些事情,我该如何将其添加到函数中?谢谢
假设您有一个从网络下载文件的下载功能,并且希望在下载任务完成时收到通知。
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 = true
和 completion Handler(success: flag)
?
我们可以使用 闭包 来达到这个目的。尝试以下
func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
//some code here
completionClosure(indexes: list)
}
在某些时候我们可以调用这个函数,如下所示。
healthIndexManager.loadHealthCareList { (indexes) -> () in
print(indexes)
}
有关闭包的更多信息,请参阅以下link。
除上述之外:可以使用尾随闭包。
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!!!!")
}
}
你的输出将是
Doing something
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 + , 简单又简短
示例:
样式 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
Doing something after Block_Completion!!
我很好奇我将如何处理这个问题。如果我有一个函数,并且我希望在它完全执行时发生某些事情,我该如何将其添加到函数中?谢谢
假设您有一个从网络下载文件的下载功能,并且希望在下载任务完成时收到通知。
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 = true
和 completion Handler(success: flag)
?
我们可以使用 闭包 来达到这个目的。尝试以下
func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
//some code here
completionClosure(indexes: list)
}
在某些时候我们可以调用这个函数,如下所示。
healthIndexManager.loadHealthCareList { (indexes) -> () in
print(indexes)
}
有关闭包的更多信息,请参阅以下link。
除上述之外:可以使用尾随闭包。
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!!!!")
}
}
你的输出将是
Doing something
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 + , 简单又简短
示例:
样式 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
Doing something after Block_Completion!!