我观看了关于闭包的视频,有人用这种方式展示了关闭的基本知识:
func outer(howMuch: Int) -> () -> Int {
var total = 0
inner() {
howMuch += total
return total
}
return inner
}
然后他继续说,当你这样做时:
let incrementBy10 = outer(10)
他说incrementBy10引用了闭包内的inner()函数。
然后他继续一个检索数据的实际例子:
let url = "*url here*"
let nsURL = NSURLSession.shareSession().dataTaskWithUrl(nsURL) {(data,response,error) in
print(NSString(data: data, encoding: NSUTF8StringEncoding)) }
'如何增加10'示例涉及从服务器获取某些数据的实际示例。我不明白他的意思是什么:"当你从网址上抓东西时,你不会立刻得到这些内容。您可以在下载网址时调用闭包。"
答案 0 :(得分:1)
这是异步回调的一个示例。
异步回调用于在长时间运行的操作(例如网络请求)完成时执行闭包。它们允许我们触发网络请求,传入回调,然后在网络操作正在进行时继续执行其他代码。只有当操作完成时,才会执行闭包,服务器返回的数据作为参数传入。
如果我们没有使用异步闭包,当我们从服务器获取内容时,应用程序将冻结(执行将停止)。这将是一个同步网络请求,它不会被使用,因为它会导致非常滞后的用户界面和糟糕的用户体验。
NSURLSession
' s dataTaskWithURL
本质上是一个异步API,它接受一个闭包作为参数,并在收到响应时触发它。
异步回调网络调用示例(将其添加到Swift Playground):
import UIKit
import XCPlayground // Only needed for Playground
// Only needed for Playground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
class HTTP {
class func GET(onSuccess: NSData -> Void ) {
NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: "http://httpbin.org/get")!, completionHandler: { data, response, error in
onSuccess(data!)
}).resume()
}
}
print("About to fire request")
HTTP.GET({ payload in
let response = NSString(data: payload, encoding: NSUTF8StringEncoding)
print("Got network response: \(response)")
})
print("Just fired request")
打印的结果不是您可能直观的结果:
About to fire request
Just fired request
Got network response: ...
Just fired request
在 Got network response: ...
之前打印,因为网络请求是异步执行的。
上述代码的同步版本将产生以下输出:
About to fire request
Got network response: ...
Just fired request