Мне было просто любопытно, как я подхожу к этому. Если бы у меня была функция, и я хотел, чтобы что-то произошло, когда оно было полностью выполнено, как бы добавить это в функцию? Благодаря
Как я могу создать функцию с обработчиком завершения в Swift?
Ответ 1
Скажите, что у вас есть функция загрузки для загрузки файла из сети и вы хотите получить уведомление о завершении задачи загрузки.
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
}
})
Надеюсь, это поможет.: -]
Ответ 2
Мне не удалось понять ответы, поэтому я предполагаю, что любой другой новичок, как и я, может иметь такую же проблему, как и я.
Мое решение делает то же самое, что и верхний ответ, но, надеюсь, немного понятнее и понятнее для новичков или людей, просто имеющих проблемы с пониманием в целом.
Чтобы создать функцию с обработчиком завершения
func yourFunctionName(finished: () -> Void) {
print("Doing something!")
finished()
}
чтобы использовать функцию
override func viewDidLoad() {
yourFunctionName {
//do something here after running your function
print("Tada!!!!")
}
}
Ваш выход будет
Doing something
Tada!!!
Надеюсь, это поможет!
Ответ 3
Пример Simple 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)
}
Как использовать его:
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")
}
})
Ответ 4
Для этой цели мы можем использовать Закрытие. Попробуйте следующее
func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
//some code here
completionClosure(indexes: list)
}
В какой-то момент мы можем вызвать эту функцию, как показано ниже.
healthIndexManager.loadHealthCareList { (indexes) -> () in
print(indexes)
}
Для получения дополнительной информации о Closures обратитесь к следующей ссылке.
Ответ 5
Я немного запутался в обработчиках обработок, сделанных на заказ. В вашем примере:
Скажите, что у вас есть функция загрузки для загрузки файла из сети и вы хотите получить уведомление о завершении задачи загрузки.
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)
}
Ваш // download code
будет выполняться асинхронно. Почему бы код не перейти прямо к вашим let flag = true
и completion Handler(success: flag)
, не дожидаясь завершения вашего кода загрузки?
Ответ 6
В дополнение к выше: Может использоваться трейлинг-закрытие.
downloadFileFromURL(NSURL(string: "url_str")!) { (success) -> Void in
// When download completes,control flow goes here.
if success {
// download success
} else {
// download fail
}
}