1

嗨我有問題我想在另一個函數完全完成後調用函數,我嘗試使用閉包來實現,但仍然沒有幫助,並且應用程序呈現新控制器,之後我得到通過向服務器發送請求執行登錄的功能的響應。如何解決它?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://stackoverflow.com/a/30401560/4831524 –

回答

1

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

謝謝,完全是我在找的 –

1

你需要調用finishLoggingIn()函數時performLogin從API響應來

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

這個我試過,但仍然是一樣的,我認爲這是JsonResult函數的問題,我會用它更新問題。 –

相關問題