¿Cómo podría crear una función con un controlador de finalización en Swift?

Tenía curiosidad sobre cómo abordaría esto. Si tuviera una función, y quería que algo suceda cuando se ejecutó por completo, ¿cómo la agregaría a la función? Gracias

Supongamos que tiene una función de descarga para descargar un archivo de la red y desea recibir una notificación cuando la tarea de descarga haya finalizado.

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 comprender 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!!!!") } } 

Tu salida será

 Doing something Tada!!! 

¡Espero que esto ayude!

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

Podemos usar Closures para este propósito. Pruebe 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

Estoy un poco confundido acerca de los manejadores 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 la tarea de descarga haya finalizado.

 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 seguirá ejecutándose de forma asíncrona. ¿Por qué el código no iría directamente a su let flag = true y completion Handler(success: flag) sin esperar a que se termine el código de descarga?

Además de lo anterior: Se puede usar cierre posterior.

 downloadFileFromURL(NSURL(string: "url_str")!) { (success) -> Void in // When download completes,control flow goes here. if success { // download success } else { // download fail } }