tipos programacion parametros parametro opcional funciones for externos datos function swift completionhandler

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 .

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html


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!