首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当从服务器检索数据时,闭包到底是做什么的?

当从服务器检索数据时,闭包到底是做什么的?
EN

Stack Overflow用户
提问于 2016-04-30 02:20:01
回答 1查看 46关注 0票数 0

我看了一段关于闭包的视频,有人以这种方式演示了闭包的基本原理:

代码语言:javascript
复制
func outer(howMuch: Int) -> () -> Int {
    var total = 0

    inner() {
        howMuch += total
        return total
    }
return inner
}

然后他接着说,当你这样做的时候:

代码语言:javascript
复制
let incrementBy10 = outer(10)

他说incrementBy10引用了闭包中的内部()函数。

然后,他接着以一个实际的例子来检索数据:

代码语言:javascript
复制
let url = "*url here*"
let nsURL = NSURLSession.shareSession().dataTaskWithUrl(nsURL) {(data,response,error) in 
print(NSString(data: data, encoding: NSUTF8StringEncoding)) }

“incrementby10”示例与从服务器获取某些数据的实际示例有何关联。我不明白他的意思:“当你从一个网址抓取东西时,你不会马上得到内容。你可以在下载了网址后打电话给闭包。”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-30 03:31:46

这是一个异步回调的例子。

异步回调用于在长期运行的操作(例如网络请求)完成后执行闭包。它们允许我们触发网络请求,传入回调,然后在网络操作进行时继续执行其他代码。只有在操作完成时,才执行闭包,服务器返回的数据作为参数传入。

如果我们不使用异步闭包,当我们从服务器获取一些东西时,应用程序就会冻结(执行将停止)。这将是一个同步网络请求,它不会被使用,因为它将导致一个非常滞后的UI和一个可怕的用户体验。

NSURLSessiondataTaskWithURL本质上是一个异步API,它接受一个闭包作为参数,并在收到响应时触发它。

异步回调

异步回调网络调用的示例(将其添加到Swift游乐场):

代码语言:javascript
复制
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")

打印的结果并不如您直觉所期望的那样:

代码语言:javascript
复制
About to fire request
Just fired request
Got network response: ...

Just fired requestGot network response: ...之前打印,因为网络请求是异步执行的。

上述代码的同步版本将产生以下输出:

代码语言:javascript
复制
About to fire request
Got network response: ...
Just fired request
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36949987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档