返回Alamofireclosures布尔

我使用Swift 2和Xcode 7.1。

我有一个连接我的用户的函数,但是它将在我的数据库连接HTTP。 我用Alamofire来执行这个请求。 我想知道,从视图控制器,如果用户连接。

我有我的function连接在一个类。 我在一个ViewController中testing连接。 喜欢这个 :

class user { // ... func connectUser(username: String, password: String){ let urlHost = "http://localhost:8888/project350705/web/app_dev.php/API/connect/" let parametersSymfonyG = [ username, password ] let url = UrlConstruct(urlHost: urlHost).setSymfonyParam(parametersSymfonyG).getUrl() //var userArray = [String:AnyObject]() Alamofire.request(.GET, url) .responseString { response in if let JSON = response.result.value { var result = self.convertStringToDictionary(JSON)! if result["status"] as! String == "success"{ let userArray = result["user"] as! [String:AnyObject] userConnect = self.saveUser(userArray) } else{ print("ERROR-CONNECTION :\n Status :\(result["status"]!)\n Code :\(result["code"]!)") } return "" } } } // ... } class MyViewController: UIViewController { // ... @IBAction func connect(sender: AnyObject?) { // CONNECTION User.connectUser(self.username.text!, password: self.password.text!) // CHECK if userConnect != nil { print("connected") }else{ print("NotConnected") } } // ... } 

第一个解决scheme:返回

要做到这一点将需要我的函数返回一个布尔值。 只有我不能使用回报。

 Alamofire.request(.GET, url) .responseString { response in if let JSON = response.result.value { var result = self.convertStringToDictionary(JSON)! if result["status"] as! String == "success"{ let userArray = result["user"] as! [String:AnyObject] userConnect = self.saveUser(userArray) } else{ print("ERROR-CONNECTION :\n Status :\(result["status"]!)\n Code :\(result["code"]!)") } return "" // Unexpected non-void return value in void function } } 

解决scheme二

我也可以testing用户是否已经login,但在testing之前,我必须等待函数完成加载。

 users.connectUser(self.username.text!, password: self.password.text!) // after if userConnect != nil { print("connected") }else{ print("NotConnected") } 

我宁愿返回一个布尔值。 这将有利于处理。 你有解决scheme吗 ?

我build议在你的connectUser方法中使用一个完成处理程序:

 func connectUser(username: String, password: String, completion:(Bool) -> ()) { // build the URL // now perform request Alamofire.request(.GET, url) .responseString { response in if let JSON = response.result.value, let result = self.convertStringToDictionary(JSON) { completion(result["status"] as? String == "success") } else { completion(false) } } } 

您可以使用以下方式调用它:

 users.connectUser(username.text!, password: password.text!) { success in if success { print("successful") } else { print("not successful") } } // But don't user `success` here yet, because the above runs asynchronously 

顺便说一句,如果你的服务器真的生成JSON,你可以使用responseJSON而不是responseString ,进一步简化代码并且不需要convertStringToDictionary

 func connectUser(username: String, password: String, completion:(Bool) -> ()) { // build the URL // now perform request Alamofire.request(.GET, url) .responseJSON { response in if let JSON = response.result.value { completion(JSON["status"] as? String == "success") } else { completion(false) } } } 

如果您已经编写了自己的服务器代码来对用户进行身份validation,只要确保设置了正确的头文件(因为responseJSON不仅为您执行JSONparsing,而且作为validation过程的一部分,它确保头文件指定JSON身体;这是一个很好的习惯来设置标题,无论)。 例如在PHP中,在echo显JSON之前,将标题设置如下所示:

 header("Content-Type: application/json"); 

您的Alamofire.request方法的完成处理程序是asynchronous的,它的签名中没有指定返回types。 这就是为什么当你在你的完成处理器closures中提供一个return语句的时候你会看到一个错误。

你将不得不把你的请求和响应处理拆分成不同的方法,并调用响应处理方法而不是使用return语句。

 Alamofire.request(.GET, url).responseString { response in if let JSON = response.result.value { var result = self.convertStringToDictionary(JSON)! if result["status"] as! String == "success"{ let userArray = result["user"] as! [String:AnyObject] userConnect = self.saveUser(userArray) processSuccessResponse() //Pass any parameter if needed } else{ print("ERROR-CONNECTION :\n Status :\(result["status"]!)\n Code :\(result["code"]!)") processFailureResponse() //Pass any parameter if needed } } } func processSuccessResponse() { //Process code for success } func processFailureResponse() { //Process code for failure } 

我这样做的首选方法是在完成处理程序中调用一个函数。 您也可以设置一个布尔标志来检查用户是否在任何给定的时间连接。

 func connectUser(username: String, password: String, ref: MyClass) { Alamofire.request(.GET, url) .responseString { response in var userIsConnected = false if let JSON = response.result.value { var result = self.convertStringToDictionary(JSON)! if result["status"] as! String == "success"{ let userArray = result["user"] as! [String:AnyObject] userConnect = self.saveUser(userArray) userIsConnected = true } else { print("ERROR-CONNECTION :\n Status :\(result["status"]!)\n Code :\(result["code"]!)") } } else { print("Response result nil") } ref.finishedConnecting(userIsConnected) } } } class MyClass { var userIsConnected = false func startConnecting() { connectUser(username, password: password, ref: self) } func finishedConnecting(success: Bool) { userIsConnected = success ... post-connection code here } }