Відповіді:
Скажіть, у вас є функція завантаження для завантаження файлу з мережі, і ви хочете, щоб його отримували сповіщення, коли завдання з завантаження закінчено.
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
}
})
Сподіваюся, це допомагає.
У мене були проблеми з розумінням відповідей, тому я припускаю, що будь-який інший новачок, як я, може мати таку ж проблему, як і я.
Моє рішення робить те саме, що головна відповідь, але, сподіваємось, трохи більш зрозумілий і легкий для розуміння для початківців або людей, які взагалі мають проблеми з розумінням.
Щоб створити функцію за допомогою обробника завершення
func yourFunctionName(finished: () -> Void) {
print("Doing something!")
finished()
}
використовувати функцію
override func viewDidLoad() {
yourFunctionName {
//do something here after running your function
print("Tada!!!!")
}
}
Ваш вихід буде
Робити щось
Тада !!!
Сподіваюся, це допомагає!
Приклад 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")
}
})
Для цього ми можемо використовувати закриття . Спробуйте наступне
func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
//some code here
completionClosure(indexes: list)
}
У якийсь момент ми можемо назвати цю функцію, як вказано нижче.
healthIndexManager.loadHealthCareList { (indexes) -> () in
print(indexes)
}
Будь ласка, перейдіть на наступне посилання для отримання додаткової інформації про закриття .
Швидкий 5.0 +, простий та короткий
приклад:
Стиль 1
func methodName(completionBlock: () -> Void) {
print("block_Completion")
completionBlock()
}
Стиль 2
func methodName(completionBlock: () -> ()) {
print("block_Completion")
completionBlock()
}
Використання:
override func viewDidLoad() {
super.viewDidLoad()
methodName {
print("Doing something after Block_Completion!!")
}
}
Вихідні дані
block_Completion
Робити щось після Block_Completion !!
Я трохи не збентежений щодо оброблювачів виготовлення на замовлення. У вашому прикладі:
Скажіть, у вас є функція завантаження для завантаження файлу з мережі, і ви хочете, щоб його отримували сповіщення, коли завдання з завантаження закінчено.
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)
не чекаючи завершення завантаження коду?