我很难理解如何使用闭包链接完成处理程序。
我正在使用的示例如下:
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。
任何有关此的帮助将不胜感激。
答案 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>