Выполнить функцию после запуска другой функции при выборе элемента из табличного представления - PullRequest
0 голосов
/ 30 апреля 2019

Когда элемент выбран в моем tableView, я хочу, чтобы первая функция, fetchChosenExerciseData , была выполнена до того, как будет запущен второй, goToSegue . Как я могу это реализовать? Я посмотрел блоки завершения, но безрезультатно.

Ниже приведен фрагмент моего кода:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath) as! UITableViewCell
    exerciseChosen = cell.textLabel!.text!
    duplicatesRemovedFromSetDataList.removeAll()
    fetchChosenExerciseData()
    goToSegue()

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 30 апреля 2019

Поскольку fetchChosenExerciseData является асинхронным, вам нужна эта структура

func fetchChosenExerciseData(completion:@escaping()->()) {
    Api.load { 
        completion()
    }
}

Вызов

fetchChosenExerciseData { 
    goToSegue()
}
0 голосов
/ 30 апреля 2019

Прежде всего добавьте блок завершения к вашему методу fetchChosenExerciseData как

func fetchChosenExerciseData(finished: () -> Void) {
     print("Doing something whatever you want!")
     finished()
}

и затем вызовите вашу функцию goToSegue из блока завершения вашего первого метода как

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath) as! UITableViewCell
    exerciseChosen = cell.textLabel!.text!
    duplicatesRemovedFromSetDataList.removeAll()
    fetchChosenExerciseData{
    goToSegue()
   }
}

Надеюсь, что это поможет!

0 голосов
/ 30 апреля 2019

Кажется, ваша функция fetchChosenExerciseData имеет некоторую асинхронную часть или некоторый код, который выполняется в другой очереди.

Для подобных условий вы должны использовать блок завершения.Таким образом, вы должны объявить `fetchChosenExerciseData 'следующим образом

func fetchChosenExerciseData (completion (()->()))
{
// Enter your code 
completion()
}

Я читал, что вы сделали это решение, но я считаю, что в этом

должна быть какая-то ошибка
0 голосов
/ 30 апреля 2019

это просто достижимо, используйте обработчик завершения:

func fetchChosenExerciseData(_ completion: @escaping () -> Void) {
     // do what you need
     completion()
}

в вашем didSelectRowAt вы можете вставить свою вторую функцию

fetchChosenExerciseData {
    // goToSegue
}
...