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

链接闭包和完成处理程序Swift 3,swift,closures,completionhandler,Swift,Closures,Completionhandler,我很难理解用闭包链接完成处理程序是如何工作的 我正在使用的示例如下: typealias CompletionHandler = (_ result: AnyObject?, _ error: NSError?) -> Void func getRequestToken(completionHandler: CompletionHandler){ taskForGET(path: "PathToWebsite.com") { (result, error) in i

我很难理解用闭包链接完成处理程序是如何工作的

我正在使用的示例如下:

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。如果在过程中的任何一点出现故障,它将返回一个错误

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

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

下一步是调用parseJSON,其中传递来自taskForGET的数据,但传递的completionhandler是taskForGET的完成处理程序。我一点也不明白

然后在parseJSON中,完成处理程序通过从其参数调用完成处理程序返回JSON或错误。在本例中,哪个是taskForGET的完成处理程序

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


在此方面的任何帮助都将不胜感激

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

顺便说一句,让我们单独声明处理程序。在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
,但它始终是同一个对象。

老实说,我建议对涉及链接多个处理程序的任何进程使用完成处理程序。在我看来,使用承诺或调度队列会简单得多。好吧,这就是我产生巨大困惑的原因。我不认为它是一个被传递的物体。非常感谢,这非常有帮助!