1

Привет, У меня проблема. Я пытаюсь вызвать функцию после того, как другая функция полностью завершена. Я пытался сделать это с помощью закрытий, но все равно это не помогает, а приложение представляет новый контроллер, и после этого я получаю ответ от функции, выполняющей логин, путем запроса на сервер. Как это исправить?Быстрая функция выполнить после выполнения другой функции

performLogin(userName: UserDefaults.standard.value(forKey: "saved_username")! as! String, password: UserDefaults.standard.value(forKey: "saved_password")! as! String){() ->() in 
      self.finishLoggingIn() 
     } 

Функция, которая делает запрос к серверу:

public func performLogin(userName: String, password: String, complete:()->()){ 

    let duom = LoginModel() 
    duom.JsonResult(param1: userName, param2: password, param3: self){() ->() in 
}} 

Функция открывающие другой контроллер:

func finishLoggingIn() { 
    print("Finish logging in") 


    let appDelegate = UIApplication.shared.delegate! as! AppDelegate 

    let initialViewController = self.storyboard!.instantiateViewController(withIdentifier: "MainVC") 
    appDelegate.window?.rootViewController = initialViewController 
    appDelegate.window?.makeKeyAndVisible() 

    UserDefaults.standard.setValue(true, forKey: "isLoggedIn") 
    UserDefaults.standard.synchronize() 
    dismiss(animated: true, completion: nil) 
} 

Json функция результат:

internal func JsonResult (param1: String, param2: String, param3: UIViewController, complete:@escaping()->()){ 

Json().login(userName: param1, password: param2) { (json, error) in 


    if error != nil { 
     //Show alert 
     print(error!.localizedDescription) 
     DispatchQueue.main.async { 
      AlertController.showErrorWith(title: "Error", message: error!.localizedDescription, controller: param3) { 

      } 
     } 


    } 

    //Access JSON here 

    if let jsonDic = json as? JSON { 

     if (jsonDic["result"].exists()){ 
       print(jsonDic["result"]["ubus_rpc_session"].stringValue) 
       if (jsonDic["result"].arrayValue.contains(6)) { 
       self.loginToken = "[6]" 
       } else { 
       for item in jsonDic["result"].arrayValue { 
       self.loginToken = item["ubus_rpc_session"].stringValue 
           } 
       } 
     } 
     if (jsonDic["error"].exists()){ 

       self.loginToken = jsonDic["error"]["message"].stringValue 

       } 
    } 
    print(self.loginToken) 

    if (!self.loginToken.isEmpty) { 

    if ((!self.loginToken.contains("[6]")) && (!self.loginToken.contains("Failed"))) { 

     UserDefaults.standard.setValue(self.loginToken, forKey: "saved_token") 
       print(self.loginToken) 



    }else { 
     if (self.loginToken.contains("Access denied")) { 
      self.loginToken = "Access denied" 
      print(self.loginToken) 
     } else if (self.loginToken.contains("Failed")) { 
      self.loginToken = "Connection timeout" 
     } else if (self.loginToken.contains("[6]")) { 
      DispatchQueue.main.async { 
       AlertController.showErrorWith(title: "Error", message: "Wrong username or password", controller: param3) { 

       } 
      } 
      self.loginToken = "Login Error" 
      print(self.loginToken) 
     } 


    } 
    } 
    self.loginToken = "" 
} 
    complete() 


} 
+0

чек с этим анс: http://stackoverflow.com/a/30401560/4831524 –

ответ

1

первая:

Вы никогда не вызывая обработчик завершения процесса performLogin:

public func performLogin(userName: String, password: String, complete:()->()){ 

    let duom = LoginModel() 
    duom.JsonResult(param1: userName, param2: password, param3: self){() ->() in 
     complete() // this line was missing 
    } 
} 

2-й:

В JsonResult метод (пожалуйста, запустите имена методов в нижнем регистре!), Вы вызываете закрытие закрытия вне Json().login s завершение закрытия. В результате JsonResult s завершение закрытия вызывается до завершения Json().login.

Чтобы это исправить, вызовите JsonResult сек закрытия завершения изнутри закрытия завершения Json().login сек:

internal func JsonResult (param1: String, param2: String, param3: UIViewController, complete:@escaping()->()){ 

    Json().login(userName: param1, password: param2) { (json, error) in 
     if error != nil { 
      //Show alert 
      print(error!.localizedDescription) 
      DispatchQueue.main.async { 
       AlertController.showErrorWith(title: "Error", message: error!.localizedDescription, controller: param3) { 

       } 
      } 
     } 

     //Access JSON here 

     if let jsonDic = json as? JSON { 
      if (jsonDic["result"].exists()){ 
       print(jsonDic["result"]["ubus_rpc_session"].stringValue) 
       if (jsonDic["result"].arrayValue.contains(6)) { 
        self.loginToken = "[6]" 
       } else { 
        for item in jsonDic["result"].arrayValue { 
         self.loginToken = item["ubus_rpc_session"].stringValue 
        } 
       } 
      } 
      if (jsonDic["error"].exists()){   
       self.loginToken = jsonDic["error"]["message"].stringValue     
      } 
     } 
     print(self.loginToken) 

     if (!self.loginToken.isEmpty) { 

      if ((!self.loginToken.contains("[6]")) && (!self.loginToken.contains("Failed"))) { 
       UserDefaults.standard.setValue(self.loginToken, forKey: "saved_token") 
       print(self.loginToken)   
     } else { 
       if (self.loginToken.contains("Access denied")) { 
        self.loginToken = "Access denied" 
        print(self.loginToken) 
       } else if (self.loginToken.contains("Failed")) { 
        self.loginToken = "Connection timeout" 
       } else if (self.loginToken.contains("[6]")) { 
        DispatchQueue.main.async { 
         AlertController.showErrorWith(title: "Error", message: "Wrong username or password", controller: param3) { 

         } 
        } 
        self.loginToken = "Login Error" 
        print(self.loginToken) 
       }   
      } 
     } 
     self.loginToken = "" 
     complete() // moved here to be called after Json().login finished 
    } 
    //complete() 
} 
+0

Спасибо, полностью, что я искал –

1

Вам нужно вызвать функцию finishLoggingIn(), когда реакция performLogin из апи приходят

duom.JsonResult(param1: userName, param2: password, param3: self){() ->() in 
self.finishLoggingIn() 
}} 
+0

Я попытался это, но все-таки то же самое, я думаю, что это проблема с функцией JsonResult, я обновлю вопрос. –

Смежные вопросы