返回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 } }