没有在布尔函数中获取/设置正确的返回值

Posted

技术标签:

【中文标题】没有在布尔函数中获取/设置正确的返回值【英文标题】:Not getting/setting the right return value in a bool function 【发布时间】:2014-10-23 02:20:50 【问题描述】:

这是我下面的快速代码。默认情况下,success 变量设置为 false。从外观上看,success 变量永远不会在对象内部更新。因此返回值总是假的。关于我应该如何解决这个问题的任何提示?

更新:我添加了println 以查看逻辑是否通过。

class Auth 
    func authUser(email: String, password: String) 
        var success : Bool = false
        let parameters = [
            "user1": [
                "adminEmail": email,
                "adminPassword": password
            ]
        ]
        var defaults = NSUserDefaults.standardUserDefaults()
        Alamofire.request(.POST, loginURL, parameters: parameters).responseJSON  (_, _, object, error) -> Void in
            if(object != nil) 
                if(JSON(object!)["success"].asBool == true) 
                   println("user signed in")
                   self.authSuccess()
                
            
        

    

func authSuccess() -> Bool 
    self.success = true
    println(success) // this does not get printed out.
    return success


ViewController.swift

@IBAction func signInButtonPressed(sender: AnyObject) 
    var auth = Auth()
    auth.authUser(emailTxtField.text, password: pwdTxtField.text)
    println(auth.success)

刚开始使用 swift。所以任何指针都是有帮助的。

【问题讨论】:

如果它从未被设置为 true,那么这意味着您没有通过您的 if 语句之一。在您的第一个正文中添加 println 以找出是哪一个并尝试找出如何从那里修复它。 我确实添加了一个 println 并且它正在通过它。后端也认证成功。 【参考方案1】:

您的 Alamofire 请求异步完成 - 请求完成后执行关闭,但是此时 authUser 方法已经返回,值为 false

authUser 不可能返回成功/失败 - 您需要从闭包中调用另一个方法来处理成功/失败

您无需检查auth 标志即可更新标签(尽管您可能希望在应用程序的其他地方使用该属性,这很好)。当authSuccess 被调用时,您可以简单地更新标签。您需要向主队列上的 UI 元素分派更新 - 您的 authSuccess 将在后台线程上执行,因此请使用

func authSuccess()  
    self.success = true
    dispatch_async(dispatch_get_main_queue())  
        self.myLabel="Authenticaton successful"
    


您还应该处理闭包中的其他情况,并在失败时调用 authFail 或其他方式,以便更新 UI 并向用户提供反馈。

【讨论】:

我做到了。更新了代码。但看起来这也没有设置好。还是我做错了? 你的代码看起来是正确的,但是你不检查错误,如果 object 为 nil,你什么也不做。由于您没有收到您的消息,我怀疑有错误或返回 nil。您可以在闭包中设置断点并检查结果 好的,所以您的另一个问题是您正在 IBAction 中创建本地 Auth 对象。一旦此对象超出范围(当 IBAction 方法退出时),它将被释放 - 这将在异步身份验证完成之前发生。尝试将 auth var 移动到属性并使用 self.auth 阅读答案第一句:你在异步调用中使用。 authSuccess 将在未来的某个时候被调用。 authUser 调用将异步调用放在队列中,最终完成,但 authUser 立即返回。如果您调用方法“startUserAuthentication”会更清楚。它不进行身份验证,它只是在将来的某个时间触发身份验证。 在编写一般的移动应用程序时(当然是 ios 应用程序),您应该考虑事件驱动程序。事件 - 按钮按下 - 触发登录的开始。甚至 - 完成登录 - 调用更新 UI/呈现新视图等的方法。Sleep 很少是一个好主意。向用户提供一些登录正在进行的反馈。

以上是关于没有在布尔函数中获取/设置正确的返回值的主要内容,如果未能解决你的问题,请参考以下文章

调用返回布尔值的JavaScript函数

返回布尔值的 Perl 函数实际上返回啥

Sonata Admin:isGranted() 在 Admin 类中总是返回 true,但在模板中返回正确的布尔值

html 使用AJAX POST请求来调用控制器操作(在页面加载时和在下拉列表中选择项目时),获取返回的布尔值,设置observabl

在嵌套函数中返回布尔值

返回布尔值和消息的Pythonic方式[重复]