Как я могу завершить функцию перед вызовом других в IBAction?

У меня проблемы с пониманием обработчиков завершения.

У меня есть textFieldEditingDidChange IBAction, который сначала вызывает функцию verify() для ввода текстового поля , а затем оператор if для логического значения, возвращаемого приложением. Проблема в том, что оператор if запускается до завершения проверки().

Вот код:

@IBOutlet weak var myTextField: UITextField!

@IBAction func myTextFieldEditingDidChange(sender: AnyObject) {

        let yo = verify(myTextField.text!)            
        print("\(yo)") // it always prints "true" because verify hasn't finished

}


func verify(myText: String) -> Bool {
    var result = true
    // some code that fetches a string "orlando" on the server
    if myText == "orlando" {
         result = false
    }
    return result
}

Как я могу сделать оператор печати или любой другой код после того, как проверка была выполнена по времени?? Спасибо


person standousset    schedule 29.02.2016    source источник


Ответы (1)


Что-то вроде этого:

func verify(myText: String, completion: (bool: Bool)->()) {
    var result = true
    // some code that fetches a string "orlando" on the server
    if myText == "orlando" {
        result = false
    }
    completion(bool: result)
}

И вы вызываете это в своем IBAction вот так, с завершающим замыканием:

verify(myTextField.text!) { (bool) in
    if bool {
        // condition in `verify()` is true
    } else {
        // condition in `verify()` is false
    }
}

Примечание: когда вы говорите «какой-то код, который извлекает строку «orlando» на сервере», будьте осторожны, чтобы не установить новый completion после асинхронного вызова, иначе вы все равно столкнетесь с той же проблемой. Завершение следует использовать в той же области, что и результат асинхронного вызова.

person Eric Aya    schedule 29.02.2016
comment
Большое спасибо, это работает. Ваша заметка тоже была полезной, так как я сделал именно ту ошибку, которую вы ожидали. Теперь работает нормально. - person standousset; 29.02.2016