Swift函数在另一个函数完成后执行

问题描述:

嗨我有问题我想在另一个函数完全完成后调用函数,我尝试使用闭包来实现,但仍然没有帮助,并且应用程序呈现新控制器,之后我得到通过向服务器发送请求执行登录的功能的响应。如何解决它?Swift函数在另一个函数完成后执行

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://*.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 
    } 
} 

2nd:

JsonResult方法(请启动方法名称小写!)您正在呼叫Json().login的完成关闭之外的完成关闭。结果JsonResult s完成关闭之前调用Json().login已完成。

为了解决这个问题,从Json().login小号完成封闭内调用JsonResult小号完成关闭:

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

谢谢,完全是我在找的 –

你需要调用finishLoggingIn()函数时performLogin从API响应来

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

这个我试过,但仍然是一样的,我认为这是JsonResult函数的问题,我会用它更新问题。 –