【问题标题】:Alamofire 5 swift 5 wait for the result of the alamofire query to show the initial viewAlamofire 5 swift 5 等待alamofire查询结果显示初始视图
【发布时间】:2020-07-26 12:41:42
【问题描述】:

目前的情况是我有一个登录视图(A)和第二个视图(B)已经登录。

我希望当我打开应用程序并且用户将值存储在 UserDefaults.standard 中时,检查这些值是否与服务器的值匹配,如果它们正确,请进入 B 视图。

问题是alamofire是异步的,A-view在你得到答案之前就加载好了。

SceneDelegate.swift

在我们知道 alamofire 是异步启动之前的第一次尝试

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

   //Code to open default viewA
   ...

   //Code to try open viewB
    let logAcepted = openViewB(url, param)
    if logAcepted //<-- this execute before query in func before
     {
       if let windowScene = scene as? UIWindowScene 
        {
            let window = UIWindow(windowScene: windowScene)
             window.rootViewController = UIHostingController(rootView: Principal())
             self.window = window
             window.makeKeyAndVisible()
         }
     }
}

我看到有一个补全字段可以帮助解决这个问题,但我认为我没有很好地应用它。

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

   //Code to open default viewA
   ...

   //Code to try open viewB
   openViewB(url, param, completion: {logAcepted in
        if logAcepted 
        {
              if let windowScene = scene as? UIWindowScene 
              {
                 let window = UIWindow(windowScene: windowScene)
                  window.rootViewController = UIHostingController(rootView: Principal())
                  self.window = window
                   window.makeKeyAndVisible()
               }
         }
      })
 }

如何让这个函数同步运行?还是让主代码等待查询结果?

func openViewB(_ url: String, _ param: [String : String], completion : @escaping (Bool)->())  {
    var ret : Bool = false
    AF.request(url, parameters:  param).responseJSON {response in
        switch response.result {
            case .success(let value):
                if let JSON = value as? [String: Any]
                {
                    let status = JSON["status"] as! String
                    switch status
                    {
                        case "Ok":
                            ret =  true
                            completion(ret)
                        default:
                            ret = false
                            completion(ret)
                    }
                }
            case .failure( _):
                ret = false
                completion(ret)
        }
    }
}

我找到了很多相关信息,但没有一个适用于这个版本的 swift/alamofire

【问题讨论】:

    标签: ios asynchronous alamofire swift5 alamofire-request


    【解决方案1】:

    不要等待,永远不要等待。

    您的openViewB 方法已经有一个完成处理程序,请使用它。

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    
        //Code to open default viewA
        ...
    
        //Code to try open viewB
        openViewB(url, param) { logAccepted in
            if logAccepted
            {
                if let windowScene = scene as? UIWindowScene 
                {
                    let window = UIWindow(windowScene: windowScene)
                     window.rootViewController = UIHostingController(rootView: Principal())
                     self.window = window
                     window.makeKeyAndVisible()
                 }
             }
        }
    }
    

    【讨论】:

    • 好的,非常感谢!这看起来很棒,很适合我。但是尝试更深入一点,如果我附加调试器,我会看到它加载了视图 A,当它完成执行查询时,它加载了视图 B。你能否让它保持在启动视图中,直到查询被执行并直接加载B 视图?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2020-04-12
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多