需要帮助了解如何使用多级函数调用处理完成处理程序



我正在寻找一些处理代码的帮助。我正在使用Alamofire进行GET和POST。由于它们是异步运行的,我需要使用完成处理程序,这样我就可以将JSON数据保存到一个变量中,并在以后使用它。

我的代码在下面,但我认为解释可能会让事情变得更清楚。函数x((需要JSON数据,并首先调用函数y((。然后,函数y((调用getRequest函数来实际执行GET。我认为,getRequest完成处理程序的设置是正确的。它的设置使y((可以拥有自己的完成处理程序代码。我现在正纠结于如何将JSON数据输出到原始函数x((。

我是否必须在函数y((中执行另一个completion: @escaping (JSON?) -> Void)completion(response),然后在所有调用y的函数中添加完成代码,或者是否有一种方法可以导出JSON数据,以便在函数x((中使用它?

func getRequest(url: String, params: [String:[String]] = ["":[""]], completion: @escaping (JSON?) -> Void) {
let headers: HTTPHeaders = [ /* Header data goes here */ ]
AF.request(url, method: .get, parameters: params, headers: headers).validate().responseJSON { (response) in
// completion code goes here
completion(response)
}

}
func y() -> JSON {

var jsonData = JSON(0)

let url = "https://url.com/v1/"
getRequest(url: url) { value in
// Add completion code here too?
}

// Since get_request uses AF.request, the reply comes asynchronously and we don't return the actual data
return jsonData
}
func x(token: String) -> JSON {

let json = y()
let jsonData = json["A"]
// Rest of code goes here
}

一旦函数使用异步函数,它也会变得异步,因为它不能同步返回数据,所以它也需要有自己的完成处理程序。

所以y应该定义为这样的东西:

func y(completion: @escaping (JSON) -> Void) {
// ...
getRequest(url: url) { value in
print(value) // or do something else with value
completion(value) // return data via callback
}
}

x相同-它需要一些完成才能返回数据或发出完成信号:

func x(token: String, completion: @escaping () -> Void) {
// ...
y() { json in
print(json)
completion() // or return something via callback
}
}

最新更新