Alamofire 5 swift 5 ждет результата запроса alamofire, чтобы показать начальный вид - PullRequest
0 голосов
/ 13 апреля 2020

В настоящее время у меня есть начальный вид входа в систему (A) и второй вид, когда (B) уже вошел в систему.

Я хочу, чтобы, когда я открываю приложение, и у пользователя есть значения сохраненный в UserDefaults.standard, убедитесь, что значения соответствуют значениям сервера, и если они верны, введите представление B.

Проблема в том, что alamofire является асинхронным, и представление A загружается до того, как вы получите ответ.

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

1 Ответ

0 голосов
/ 14 апреля 2020

Не ждите, никогда не ждите.

Ваш метод 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()
             }
         }
    }
}
...