Respostas:
Digamos que você tenha uma função de download para baixar um arquivo da rede e deseja ser notificado quando a tarefa de download for concluída.
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.
Tive dificuldade em entender as respostas, então presumo que qualquer outro iniciante como eu possa ter o mesmo problema que eu.
Minha solução faz o mesmo que a resposta principal, mas espero que seja um pouco mais clara e fácil de entender para iniciantes ou pessoas com dificuldade de entender em geral.
Para criar uma função com um manipulador de conclusão
func yourFunctionName(finished: () -> Void) {
print("Doing something!")
finished()
}
usar a função
override func viewDidLoad() {
yourFunctionName {
//do something here after running your function
print("Tada!!!!")
}
}
Sua saída será
Fazendo algo
Tada !!!
Espero que isto ajude!
Exemplo simples 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)
}
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 ponto, podemos chamar essa função conforme fornecido a seguir.
healthIndexManager.loadHealthCareList { (indexes) -> () in
print(indexes)
}
Consulte o link a seguir para obter mais informações sobre fechamentos .
Swift 5.0 +, simples e curto
exemplo:
Estilo 1
func methodName(completionBlock: () -> Void) {
print("block_Completion")
completionBlock()
}
Estilo 2
func methodName(completionBlock: () -> ()) {
print("block_Completion")
completionBlock()
}
Usar:
override func viewDidLoad() {
super.viewDidLoad()
methodName {
print("Doing something after Block_Completion!!")
}
}
Resultado
block_Completion
Fazendo algo após Block_Completion !!
Estou um pouco confuso sobre manipuladores de conclusão personalizados. No seu exemplo:
Digamos que você tenha uma função de download para baixar um arquivo da rede e deseja ser notificado quando a tarefa de download for concluída.
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
continuará sendo executado de forma assíncrona. Por que o código não iria direto para você let flag = true
e completion Handler(success: flag)
sem esperar que o código de download fosse concluído?