无法在其范围之外访问关闭数据

时间:2017-04-27 01:47:26

标签: ios swift scope closures

我正在使用Alamofire向API发出异步网络请求。在闭包内部,我将响应的数据分配给特定变量(championRolesLibrary)。现在在闭包内部,当我打印变量以查看其内容(第1项)时,它包含我希望它拥有的所有数据。在关闭表达式(第2项)之外,当检查同一个对象,并且未在1和2之间以任何方式进行修改时,它不再具有任何数据且为空。为什么是这样?

Alamofire.request(championRolesUrl!).responseJSON { response in
    let result = response.result
        if result.isSuccess {
            if let data = result.value as? [[String:AnyObject]] {
                for champion in data {
                    if let name = champion["name"] as? String {

                        if let roles = champion["roles"] as? Array<Dictionary<String, AnyObject>> {
                            championRoles = []
                            for role in roles {
                                if let roleName = role["name"] as? String {
                                    championRoles.append(Role(roleName)!)
                                }
                            }
                            championRolesLibrary.append([name:championRoles])
                        }
                    }
                }
                print(championRolesLibrary) // 1
            }
        } else {
            print("Downloading Role Data Failed Because: \(result.error)")
        }
    }
}
print(championRolesLibrary) // 2

2 个答案:

答案 0 :(得分:1)

Alamofire's documentation说:

  

Alamofire中的网络是异步完成的。异步   编程可能是程序员不熟悉的挫折源   这个概念,但有很好的理由这样做   方式。

这意味着当您执行请求时,您是异步执行请求,因此当您在闭包之外打印championRolesLibrary时,实际上是在请求返回数据之前打印它。

答案 1 :(得分:0)

闭包是自包含的功能块,可以在代码中传递和使用。 Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambdas。

所以,这里你的所有代码语句都是在执行Alamofire代码之前执行的,执行完每个语句之后,Alamofire开始执行,这就是为什么你没有在闭包外获取值,因为外部语句已被执行已经