2017-01-02 24 views
0

之前,这是我的代码:等待此完成处理程序完成执行的函数返回的价值

 func authenticateCredentials(usernameString: String, passwordString: String) ->() -> Bool { 
     func isAuthUser() -> Bool { 

     client.invokeAPI("AuthenticateAndFetchData", 
         body: nil, 
         httpMethod: "GET", 
         parameters: ["userid": usernameString,"password":passwordString], 
         headers: nil) 
     { 
      (result, response, error) -> Void in 
      if let err = error { 
       print("ERROR ", err) 

      } else if let res = result { 



        let jsonArray = res as! NSArray 
        for value in jsonArray[0] as! NSDictionary { 
         let jsonstring = value.value as! String 
         NetworkService.jsonResponse = jsonstring 
         if let data = jsonstring.data(using: .utf8) { 
          if let content = try? JSONSerialization.jsonObject(with: data, options: []), 
           let array = content as? [[String: Any]] 
          { 
           for jsondict in array { 
            let auth = jsondict["IsAuth"]! as! String 
            self.isAuth = (auth == "true") ? true : false 
            let substring = NetworkService.parseJSONString(jsonString: jsonstring, key: "Activities") 
            let substring2 = NetworkService.parseJSONString(jsonString: substring(), key: "activityname") 
            let activityString = NetworkService.parseJSONvalue(jsonString:substring()) 
           } 
          } 
         } 
        } 
       } 
      } 
      return self.isAuth 
     } 
     return isAuthUser 

    } 

} 

我请登录按钮,此功能。但是当我用正确的凭证第一次按下按钮时,此函数返回false,当我再次按下时,则完成处理程序已执行,它将isAuth更改为true,并且该函数返回true。

所以,我必须按两次按钮才能进行身份验证,我如何才能使它仅在第一次返回true。我希望在函数返回之前等待完成块的执行。

+0

而不是从你的函数返回true或false。将其称为异步并将您的代码放入完成处理程序 –

+0

感谢您的回应。我是新来的迅速。你能帮我吗我该怎么称呼功能异步。 –

回答

0

假设你的客户端调用已异步并呼吁主队列的完成处理程序,添加完成处理程序作为一个额外的参数传递给你的方法:

func authenticateCredentials(usernameString: String, passwordString: String, completion: @escaping (Bool) -> Void){ 
    client.invokeAPI("AuthenticateAndFetchData", 
       body: nil, 
       httpMethod: "GET", 
       parameters: ["userid": usernameString,"password":passwordString], 
       headers: nil) { 
     ... 
     let auth = jsondict["IsAuth"]! as! String 
     let isAuth = (auth == "true") ? true : false 
     ... 
     completion(isAuth) 
    } 
} 

可以比这样调用:

authenticateCredentials(usernameString: "user", passwordString: "pass") { (isAuth:Bool) in 
    self.isAuth = isAuth 
    // go on with whatever you want to do and use self.isAuth successfully 
} 
+0

完成需要bool作为b参数或void? –

+0

xcode要求我在完成参数前添加@escaping –

+0

当我调用函数isAuth:Bool in self.isAuth = isAuth时,我没有得到调用部分。它给编译器错误。 –