gpt4 book ai didi

ios - 在 Alamofire 闭包中返回 Bool

转载 作者:搜寻专家 更新时间:2023-10-31 08:11:56 25 4
gpt4 key购买 nike

我使用 Swift 2 和 Xcode 7.1。

我有一个连接我的用户的功能,但它会使用 HTTP 连接我的数据库。我使用 Alamofire 来执行这个请求。我想从 View Controller 知道用户是否已连接。

我的函数连接在一个类中。我在 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")
}
}

// ...

}

第一个解决方案:返回

这样做需要我的函数返回一个 bool 值。只有我不能使用返回。

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

第二种解决方案:

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

users.connectUser(self.username.text!, password: self.password.text!)

// after
if userConnect != nil {
print("connected")
}else{
print("NotConnected")
}

我宁愿返回一个 bool 值。这将有助于处理。你有解决办法吗?

最佳答案

我建议在您的 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)
}
}
}

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

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

顺便说一句,如果你的服务器真的生成 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)
}
}
}

如果您编写了自己的服务器代码来验证用户身份,只需确保设置正确的 header (因为 responseJSON 不仅为您解析 JSON,而且作为其验证的一部分process,它确保 header 指定 JSON 主体;不管怎样,设置 header 是一种很好的做法)。例如在 PHP 中,在 echo JSON 之前,像这样设置 header :

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

关于ios - 在 Alamofire 闭包中返回 Bool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34121289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com