[英]How to force Swift to wait the previous code is finished?
我刚开始学习Swift,我在后面使用API,问题是: Swift不要等待我的函数完成,因此我的最后一个函数看起来像之前没有完成任何代码 。
import Foundation
import UIKit
import Alamofire
import SwiftyJSON
// Classes
class User {
init(data: Any) {
self.sex = JSON(data)["sex"].string!
print(self.sex)
}
var id: Int = 1
var online: Bool = false
var picture: String = ""
var sex: String = "Male"
}
// Fonctions
func getBackground(_ apiURL: String, completion : @escaping(_ :Any) -> Void) {
// Requête API avec Alamofire + SwiftyJSON
AF.request(apiURL, method: .get).validate().responseJSON { response in
switch response.result {
case .success(let value):
let jsonData = JSON(value)
completion(jsonData["results"])
case .failure(let error):
print(error)
}
}
}
// Requête de connexion
getBackground("https://x..me", completion: { response in
let user = User(data: response)
})
print(String(user.id) + ": " + String(user.online!))
我有这个错误:“使用未解析的标识符'user'”,我想Swift并没有得到User先前已定义的事实
我所有的工作都可以与我的API完美配合,在构建代码时会设置并显示“ self.sex”。 但是我仍然被“锁定”,就像在这段代码之后我什么都不做,因为Swift不想等待。
我尝试了异步和同步功能,但是接下来,我所有的下一个代码都必须在一个功能下...
提前致谢
无需等待。
将print
行和完成用户操作的代码放在完成封口中
getBackground("https://a.clet.me", completion: { response in
let user = User(data: response)
print(String(user.id) + ": " + String(user.online!))
})
错误Use of unresolved identifier 'user'
是因为局部变量user
是唯一的范围(内可见{}
其声明的)。
因此,这个问题全与变量生命周期有关。
// This happens first
getBackground("https://a.clet.me", completion: { response in
let user = User(data: response)
// This happens third, once the request has completed.
// user exists here.
// Only after this moment you should handle anything related to the user
})
// This happens second
// user DOESN'T exist here, swift will move on
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.