首页 > 解决方案 > 处理由于 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")
            }
        }
    }
}

标签: swiftalamofire

解决方案


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")
}   

推荐阅读