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