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

时间:2017-05-17 02:53:18

标签: swift closures completionhandler

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

我正在使用的示例如下:

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的数据,但是传递的completehandler是taskForGET的完成处理程序。我根本不明白这一点。

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

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

任何有关此的帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

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