function - programacion - ¿Cómo podría crear una función con un controlador de finalización en Swift?
tipos de datos en swift (6)
Además de lo anterior: se puede usar el cierre posterior.
downloadFileFromURL(NSURL(string: "url_str")!) { (success) -> Void in
// When download completes,control flow goes here.
if success {
// download success
} else {
// download fail
}
}
Tenía curiosidad sobre cómo abordaría esto. Si tuviera una función y quisiera que sucediera algo cuando se ejecutara completamente, ¿cómo agregaría esto a la función? Gracias
Ejemplo simple de 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)
}
Cómo usarlo:
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")
}
})
Estoy un poco confundido acerca de los controladores de finalización personalizados. En tu ejemplo:
Supongamos que tiene una función de descarga para descargar un archivo de la red y desea recibir una notificación cuando finalice la tarea de descarga.
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)
}
Su
// download code
aún se ejecutará de forma asincrónica.
¿Por qué el código no iría directamente a su
let flag = true
y el
completion Handler(success: flag)
sin esperar a que finalice su código de descarga?
Podemos usar cierres para este propósito. Intenta lo siguiente
func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
//some code here
completionClosure(indexes: list)
}
En algún momento podemos llamar a esta función como se indica a continuación.
healthIndexManager.loadHealthCareList { (indexes) -> () in
print(indexes)
}
Consulte el siguiente enlace para obtener más información sobre los cierres .
Supongamos que tiene una función de descarga para descargar un archivo de la red y desea recibir una notificación cuando finalice la tarea de descarga.
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
}
})
Espero eso ayude. : -]
Tuve problemas para entender las respuestas, así que supongo que cualquier otro principiante como yo podría tener el mismo problema que yo.
Mi solución hace lo mismo que la respuesta principal, pero espero que sea un poco más clara y fácil de entender para principiantes o personas que simplemente tienen problemas para entender en general.
Para crear una función con un controlador de finalización
func yourFunctionName(finished: () -> Void) {
print("Doing something!")
finished()
}
para usar la función
override func viewDidLoad() {
yourFunctionName {
//do something here after running your function
print("Tada!!!!")
}
}
Su salida será
Doing something
Tada!!!
¡Espero que esto ayude!