Как связать функции с обработчиком завершения в Swift? - PullRequest
0 голосов
/ 07 мая 2018

Я соединяю некоторые функции вместе и не могу понять, как вызвать обработчик завершения с возвращаемым значением, как только все функции будут выполнены.

func getAirQuality(completion: (aqi: Int?) -> Void) {
    callAPI()
}

private func callAPI() {
    // ... get data
    self.parseDataForAQI(data: data)
}

private func parseDataForAQI(data: Data) {
    let aqi = aqi
    // Send aqi up to completion handler in getAirQuality
}

Так что, когда все сказано и сделано, я могу сделать что-то вроде этого:

getAirQuality(completion: { aqi -> Void in {
    // Do something with aqi
})

1 Ответ

0 голосов
/ 07 мая 2018

Мое первое предположение состоит в том, что ваши первые 3 функции являются частью класса. Если это так, один из подходов заключается в том, чтобы сохранить обработчик завершения в качестве переменной экземпляра.

class AirQualityProvider {
    var aBlock: ((Int?) -> Void)?

    func getAirQuality(completion: @escaping (Int?) -> Void) {
        aBlock = completion
        callAPI()
    }

    private func callAPI() {
        let data = Data()
        parseDataForAQI(data: data)
    }

    private func parseDataForAQI(data: Data) {
        let aqi = 1
        if let completion = aBlock {
            completion(aqi)
        }
    }
}

Вот пример звонящего на игровой площадке.

let aqp = AirQualityProvider()
aqp.getAirQuality { (value) in
    if let value = value {
        print("Value = \(value)")
    }
}
...