swift - 处理由于 AlamoFire 中的异步通信导致的延迟
问题描述
我了解 AlamoFire 和与云数据库的 URL 通信是异步的。我的问题是大多数人如何处理几秒钟的通信延迟。如果用户登录,我的应用程序会存储用户的电子邮件地址和 true 的布尔值。如果为 true,它会跳转到带有详细信息的第二个视图控制器。由于延迟,没有任何信息。我延迟了 2 秒,但从视图一到视图二的转换看起来很笨拙。附上代码。我也在考虑等待屏幕,但不确定。任何帮助都会很棒。谢谢。
var defaultValue:UserDefaults!
override func viewDidLoad() {
super.viewDidLoad()
defaultValue = UserDefaults.standard
if let emailUD = defaultValue.object(forKey: "loginEmail") as? String{
textEmail.text = emailUD
print("Stored email -", emailUD)
}
if let loggedin = defaultValue.object(forKey: "isLoggedIn") as? Bool{
if loggedin != true{
let parameters1: Parameters=[
"email":"perry.aten@mymail.com",
"password":passwordIn
]
Alamofire.request(URL_USER_LOGIN, method: .get, parameters: parameters1).responseJSON
{ response1 in
if response1.result.value != nil{
let guardianJSON = JSON(response1.result.value!)
let guardian:String = guardianJSON[0]["guardian"].string!
print(guardian)
print(guardianJSON)
let league:String = guardianJSON[0]["league"].string!
let parameters2: Parameters=[
"league":league
]
//Getting League name
Alamofire.request(URL_LEAGUE, method: .get, parameters: parameters2).responseJSON
{ response2 in
if response2.result.value != nil {
let leagueJSON = JSON(response2.result.value!)
leagueName=leagueJSON[0]["name"].string!
print(leagueJSON)
}
}
}
}
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0){
let loggedInVC = self.storyboard?.instantiateViewController(withIdentifier: "LoggedInID") as! LoggedINViewController
self.present(loggedInVC, animated: false, completion: nil)
print("They are logged in viewDidLoad")
}
}
}
}
解决方案
这
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0){
let loggedInVC = self.storyboard?.instantiateViewController(withIdentifier: "LoggedInID") as! LoggedINViewController
self.present(loggedInVC, animated: false, completion: nil)
print("They are logged in viewDidLoad")
}
不是正确的方法,因为 2 秒的时间可能过去了,请求仍然没有返回或在它之前返回,这将是您的应用程序的延迟,这不是一个好的做法,您需要创建一个函数并从回调中调用它
Alamofire.request(URL_LEAGUE, method: .get, parameters: parameters2).responseJSON { response2 in
if response2.result.value != nil {
let leagueJSON = JSON(response2.result.value!)
leagueName=leagueJSON[0]["name"].string!
print(leagueJSON)
// call here
self.next()
}
}
func next() {
let loggedInVC = self.storyboard?.instantiateViewController(withIdentifier: "LoggedInID") as! LoggedINViewController
self.present(loggedInVC, animated: false, completion: nil)
print("They are logged in viewDidLoad")
}
推荐阅读
- uwp - Task.Delay 被跳过
- encryption - 如何从日期创建用户密钥?
- c# - 基于元素属性反序列化 XML
- azure-devops - 如何使用扩展将自定义选项卡添加到新的 Azure DevOps Releases Hub?
- python - 在大数据上计算 node_centrality 和 edge_centrality 的性能问题
- clojure - 如何在 Clojure 中捕获一个 arity 异常?
- xamarin - 将 JSONObject (Android) 移植到 JObject (JSON.NET)
- mysql - 查找两列之间的 DATEDIFF 并创建自己的列
- c++ - 孤立代码块在结构中抛出异常
- java - JPA Criteria API - LEFT OUTER JOIN 未填充 @OneToMany 列表