我很难理解链接完成处理程序与闭包的工作原理。
我正在使用的示例如下:
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/