1

目前的情况是我有一个初始视图登录 (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

4

1 回答 1

0

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

您的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()
             }
         }
    }
}
于 2020-04-13T21:03:32.627 回答