Como eu poderia criar uma function com um manipulador de conclusão no Swift?

Eu estava apenas curioso para saber como abordaria isso. Se eu tivesse uma function e quisesse que algo acontecesse quando fosse totalmente executada, como eu adicionaria isso à function? obrigado

Digamos que você tenha uma function de download para baixar um arquivo da rede e deseja ser notificado quando a tarefa de download terminar.

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 que ajude. : -]

Eu tive dificuldade em entender as respostas, então estou assumindo que qualquer outro iniciante como eu possa ter o mesmo problema que eu.

Minha solução faz o mesmo que a resposta principal, mas esperamos que seja um pouco mais clara e fácil de entender para iniciantes ou pessoas que tenham dificuldade de entender em geral.

Para criar uma function com um manipulador de conclusão

 func yourFunctionName(finished: () -> Void) { print("Doing something!") finished() } 

para usar a function

  override func viewDidLoad() { yourFunctionName { //do something here after running your function print("Tada!!!!") } } 

Sua saída será

 Doing something Tada!!! 

Espero que isto ajude!

Exemplo simples do 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) } 

Como usá-lo:

 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. Tente o seguinte

 func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) { //some code here completionClosure(indexes: list) } 

Em algum momento podemos chamar essa function como dado abaixo.

 healthIndexManager.loadHealthCareList { (indexes) -> () in print(indexes) } 

Por favor, consulte o seguinte link para obter mais informações sobre Closures .

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

Estou um pouco confuso sobre manipuladores de conclusão personalizados. No seu exemplo:

Digamos que você tenha uma function de download para baixar um arquivo da rede e deseja ser notificado quando a tarefa de download terminar.

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

Seu // download code ainda será executado de forma assíncrona. Por que o código não foi direto para o seu let flag = true e para o completion Handler(success: flag) sem aguardar o término do seu código de download?

Além de acima: O fechamento à direita pode ser usado.

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