链接闭包和完成处理程序 Swift 3

Chaining closures and completion handlers Swift 3

我很难理解如何使用闭包链接完成处理程序。

我正在使用的示例如下:

typealias CompletionHandler = (_ result: AnyObject?, _ error: NSError?) -> Void
func getRequestToken(completionHandler: CompletionHandler){
    taskForGET(path: "PathToWebsite.com") { (result, error) in
        if let error = error {
            print(error)
        } else {
            print(result)
        }
    }
}

func taskForGET(path: String, completionHandler: CompletionHandler) {
    //URLSESSIONCODE with completion handler
    (data, response, error) {
        if let error = error {
            CompletionHandler(result: nil, error: error)
        } else {
            let data = data
            parseJSON(data: data, completionHandler: completionHandler)
        }
    }

}
func parseJSON(data: NSData, completionHandler: CompletionHandler) {
    //SerializingJSON with do catch block
    do {
        completionHandler(result: theResult, error: nil)
    } catch {
        completionHandler(result: nil, error: error)
    }
}

基本上这段代码的作用是启动对服务器的 GET 请求。如果 GET 请求发回数据,则将其解析为 JSON。如果在此过程中的任何时候出现故障,则 return 是一个错误。

我基本上明白这里发生了什么,但我不明白完成处理程序是如何被触发的。

第一个 taskForGET 被调用,它有一个完成处理程序作为参数,可以 return 结果或错误,我知道了。

下一步是调用 parseJSON,其中传递来自 taskForGET 的数据,然后传递的完成处理程序是 taskForGET 的完成处理程序。这个我完全不懂。

然后在 parseJSON 中,完成处理程序 returns JSON 或通过从其参数调用完成处理程序的错误..在这种情况下是 taskForGET 的完成处理程序?

我不懂流程。即使我们已经成功解析 JSON,调用 taskForGET 的结果如何返回到 getRequestToken。

如有任何帮助,我们将不胜感激。

只有一个个完成处理程序从一种方法传递到另一种方法。

让我们单独声明处理程序,顺便说一句。 in Swift 3 省略类型别名中的参数标签:

typealias CompletionHandler = (Any?, Error?) -> Void

let handler : CompletionHandler = { (result, error) in
    if let error = error {
        print(error)
    } else {
        print(result)
    }
}

这个闭包应该在进程结束时执行。现在 getRequestToken 方法看起来像

func getRequestToken(completionHandler: CompletionHandler){
    taskForGET(path: "PathToWebsite.com", completionHandler: handler)
}

处理程序/闭包作为参数从 getRequestToken 传递到 taskForGET,然后从 taskForGET 传递到 parseJSON,但它始终是同一个对象。