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

标签 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 的数据,但传递的完成处理程序是 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但它始终是同一个对象。

关于swift - 链接闭包和完成处理程序 Swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44014714/

相关文章:

c# - Closure 的 R 实现不同于其他函数式语言,这使得它表现得像 C# 等命令式语言?

ios - swift 中不同类型的闭包语法——哪一个是正确的?

swift - Array<String> 类型的不可变值只有名为 'append' 的可变成员

ios - 如何使用 AVCaptureDeviceDiscoverySession 获取前置摄像头、后置摄像头和音频

更新后 Xcode 找不到模块

swift - Xcode 7 和 swift 2.0 的新服务堆栈客户端无法成功编译它生成的代码?

javascript - 闭包,for 循环

javascript - 为什么在这种情况下超时变量是可共享的?

swift - 我们如何使用 completionHandler 在 swift 中编写自己的函数

ios - 使用非空完成处理程序的 Swift 网络会出错