我正在使用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
答案 0 :(得分:1)
Alamofire中的网络是异步完成的。异步 编程可能是程序员不熟悉的挫折源 这个概念,但有很好的理由这样做 方式。
这意味着当您执行请求时,您是异步执行请求,因此当您在闭包之外打印championRolesLibrary
时,实际上是在请求返回数据之前打印它。
答案 1 :(得分:0)
闭包是自包含的功能块,可以在代码中传递和使用。 Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambdas。
所以,这里你的所有代码语句都是在执行Alamofire代码之前执行的,执行完每个语句之后,Alamofire开始执行,这就是为什么你没有在闭包外获取值,因为外部语句已被执行已经