【问题标题】:How to chain functions with a completion handler in Swift?如何在 Swift 中使用完成处理程序链接函数?
【发布时间】:2018-05-07 17:30:20
【问题描述】:

我将一些函数链接在一起,一旦所有函数都运行完毕,我不知道如何调用带有返回值的完成处理程序。

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
})

【问题讨论】:

  • 你必须在 getAirQuality 中调用 completion(aqi: Int?)
  • 将完成保存在最后一个函数可以看到的地方,并在该函数完成时调用它。
  • 如果您不介意使用 3rd 方库,PromiseKit 使链接异步函数调用比使用完成处理程序更容易。

标签: swift chaining completionhandler


【解决方案1】:

我的第一个假设是你的前 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)")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    相关资源
    最近更新 更多