如何在 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 中使用完成处理程序链接函数?的主要内容,如果未能解决你的问题,请参考以下文章
iOS Swift 如何为 For 循环 SKAction 使用完成处理程序