我使用Swift 2和Xcode 7.1.
我有一个连接我的用户的功能,但它将使用HTTP连接我的数据库.我使用Alamofire执行此请求.我想知道,如果用户已连接,则从视图控制器.
我的功能连接在一个类中.我在ViewController中测试连接.像这样 :
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")
}
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
第一个解决方案:返回
要这样做,我的函数将返回一个布尔值.只有我不能使用退货.
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
}
}
Run Code Online (Sandbox Code Playgroud)
二解决方案:
我还可以测试用户是否已经登录,但在测试之前,我必须等待功能已经完成加载.
users.connectUser(self.username.text!, password: self.password.text!)
// after
if userConnect != nil {
print("connected")
}else{
print("NotConnected")
}
Run Code Online (Sandbox Code Playgroud)
我宁愿返回一个布尔值.它将促进处理.你有解决方案吗 ?
Rob*_*Rob 12
我建议在你的connectUser方法中使用一个完成处理程序:
func connectUser(username: String, password: String, completion: @escaping (Bool) -> Void) {
// build the URL
// now perform request
Alamofire.request(url)
.responseString { response in
if let json = response.result.value, let result = self.convertStringToDictionary(json) {
completion(result["status"] as? String == "success")
} else {
completion(false)
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以用它来调用它:
users.connectUser(username.text!, password: password.text!) { success in
if success {
print("successful")
} else {
print("not successful")
}
}
// But don't use `success` here yet, because the above runs asynchronously
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果你的服务器真的在生成JSON,你可以使用responseJSON而不是responseString进一步简化代码,并且不再需要convertStringToDictionary:
func connectUser(username: String, password: String, completion: @escaping (Bool) -> Void) {
// build the URL
// now perform request
Alamofire.request(url)
.responseJSON { response in
if let dictionary = response.result.value as? [String: Any], let status = dictionary["status"] as? String {
completion(status == "success")
} else {
completion(false)
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您编写了自己的服务器代码来验证用户身份,请确保设置正确的标头(因为responseJSON不仅为您进行JSON解析,而且作为其验证过程的一部分,它确保标头指定JSON正文;无论如何设置标题是一种好习惯.例如在PHP中,在你echo使用JSON 之前,像这样设置标题:
header("Content-Type: application/json");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2043 次 |
| 最近记录: |