我正在创建一个静态函数,用于检查用户注册的电子邮件是否正在使用中。如果电子邮件正在使用中,则该函数应返回true
,否则false
。
我的代码总是返回false
,似乎我使用的变量没有更新。
任何想法我做错了什么,为什么这不能按预期工作?
class userInfo: NSObject {
static func userRegistration(email: String) -> Bool {
var emailIsavailable = false
Alamofire.request(.GET, "https://example/check_email.php?email=\(email)")
.responseString{ response in
if let responseValue = response.result.value {
print("Response String: \(responseValue)")
if responseValue == "email is available"{
print("email available")
emailIsavailable = true //emailIsavailable is not updated
}else{
print("email not available")
emailIsavailable = false //emailIsavailable is not updated
}
}
}
return emailIsavailable // returns always false
}
}
答案 0 :(得分:1)
因为它在不同的线程中运行所以你不能直接返回。您应该使用回调(或其他调用块,闭包)。你应该编辑代码:
class userInfo: NSObject {
static func userRegistration(email: String, callBack : (emailIsavailable : Bool) -> Void) {
Alamofire.request(.GET, "https://example/check_email.php?email=\(email)")
.responseString{ response in
if let responseValue = response.result.value {
print("Response String: \(responseValue)")
if responseValue == "email is available"{
print("email available")
callBack(emailIsavailable: true)
}else{
print("email not available")
callBack(emailIsavailable: false)
}
}
}
}
}
你可以这样打电话:
yourInstance.userRegistration("test") { (emailIsavailable) -> Void in
//you can get emailIsavaiable or something here
}
答案 1 :(得分:0)
该功能将始终返回false
,因为启动的网络请求是异步(并且该请求的响应可以更改emailIsavailable
的值)。
异步基本上意味着响应不会与该功能的执行同步接收。
我建议通过删除返回类型-> Bool
来更改该函数签名,并添加完成处理程序作为参数。然后,在收到响应时,您将调用该处理程序。
有些事情:
class userInfo: NSObject {
static func userRegistration(email: String, completionHandler: ((String) -> Void)) {
Alamofire.request(.GET, "https://example/check_email.php?email=\(email)")
.responseString{ response in
if let responseValue = response.result.value {
completionHandler(responseValue)
}
}
}
}
答案 2 :(得分:0)
import Foundation
func foo() -> Bool {
var ret = false
// asynchronous code
// asyn will return immediately !!!
async { () -> () in
ret = true
print("print ret from completion block:", ret)
}
// ret value is false at this point
return ret
}
// this function is executed on its own queue. (aka Alamofire do)
func async(completion: ()->()) {
let queue = dispatch_queue_create("async", DISPATCH_QUEUE_CONCURRENT)
dispatch_async(queue) { () -> Void in
// do something and then
// execute completion
completion()
}
}
// will always return false !!
print("foo return:", foo())
/*
foo return: false
print ret from completion block: true
*/
您必须设计自己的同步机制。通常,如果需要执行某些函数的结果,则必须同步执行该函数。