如何在 Swift 中使用完成处理程序链接函数?

Posted

技术标签:

【中文标题】如何在 Swift 中使用完成处理程序链接函数?【英文标题】:How to chain functions with a completion handler in 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 使链接异步函数调用比使用完成处理程序更容易。 【参考方案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)")
    

【讨论】:

以上是关于如何在 Swift 中使用完成处理程序链接函数?的主要内容,如果未能解决你的问题,请参考以下文章

swift - 如何从系统函数的完成处理程序闭包中返回?

Swift:如何调用其中一个参数是完成处理程序的函数

如何在 swift 中包含多个功能的完成处理程序?

iOS Swift 如何为 For 循环 SKAction 使用完成处理程序

从 swift 评估 javascript 函数,在完成处理程序中得到 nil

从 Java Script (TVML) 调用带有完成处理程序的 Swift 函数