Swift 2 - 使用 Alamofire 时函数不返回 Bool
Posted
技术标签:
【中文标题】Swift 2 - 使用 Alamofire 时函数不返回 Bool【英文标题】:Swift 2 - Function not return Bool when using Alamofire 【发布时间】:2015-11-20 12:41:29 【问题描述】:我正在创建一个静态函数来检查用于注册的用户电子邮件是否正在使用中。如果电子邮件正在使用中,该函数应返回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
【问题讨论】:
【参考方案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
【讨论】:
非常感谢。这是一个非常有价值的答案。【参考方案2】:该函数将始终返回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)
【讨论】:
【参考方案3】: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
*/
您必须设计自己的同步机制。一般来说,如果你需要某个函数执行的结果,则该函数必须同步执行。
【讨论】:
以上是关于Swift 2 - 使用 Alamofire 时函数不返回 Bool的主要内容,如果未能解决你的问题,请参考以下文章
使用 alamofire 2.0 和 Swift 2.0 的 POST 请求
如何使用 Alamofire (Swift 2.2) 获取 Twitter 访问令牌
如何使用 Swift 5 在 Xcode 10.2.1 中添加 alamofire