Как отсрочить выполнение функции?


#1

Есть две функции, вызываемые во viewDidLoad() - первая выполняет JSON-запрос на сервер и сохраняет полученные данные. вторая выполняет некоторые действия на основе полученных данных. Возникла следующая проблема: Первая функция не успевает получить и сохранить данные, в результате вторая работает некорректно. Видимо, следует искусственно задать некую задержку выполнения 2-й функции. интересно, как это можно реализовать?

rMan.getAccounts(StartDate: “2000-01-01”, EndDate: operDate, UserID: userID)

// Здесь нужна задержка

rMan.getOperations(AccID: mainAccountID, StartDate: “2000-01-01”, EndDate: oDate)


#2

perform?
https://developer.apple.com/documentation/objectivec/nsobject/1416176-perform
А вообще для работы с запросами наверно лучше использовать фреймворк который умеет делать это асинхронно, чтобы не подвешивать интерфейс.


#3
func delay(delay: Double, closure: () -> ()) {
    DispatchQueue.main.after(when: .now() + delay) {
        closure()
    }
}

delay(10) {
  print("Hello world!")
}

#4

Можно у первой функции создать completionHandler и в него поместить вызов второй функции. Тогда вторая начнет выполняться только по окончанию первой.

Код для самих функций:

func getAccounts(startDate: String, endDate: String, userID: String, completionHandler: () -> ()) {
    	// Выполнение функции
    	completionHandler()
}
    	
func getOperations(accID: String, startDate: String, endDate: String) {
    	// Выполнение функции
}

Вызов во viewDidLoad():

getAccounts(startDate: "Info", endDate: "Date", userID: "Name") {
    	getOperations(accID: "AccountID", startDate: "StartDate", endDate: "EndDate")
}

В completionHandler можно добавить переменные, если они необходимы для вызова второй функции.
И советую использовать camelCase, в частности, переменные называть с маленькой буквы. Т.е. endDate, userID и т.д.