Как я могу создать функцию с обработчиком завершения в 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 обратитесь к следующей ссылке.

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

Ответ 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
  }
}