2014-12-03 181 views
2

我正在尝试使用用Swift编写的Parse。我能登录,没有任何麻烦,但我有告诉我的应用程序,用户登录挣扎。在Swift中从Block返回布尔值

我使用logInWithUsernameInBackground,我只是想,如果在日志中成功返回一个布尔值。

当我使用:

func authenticateUser() -> Bool{ 
    PFUser.logInWithUsernameInBackground(userName.text, password: passwordField.text, block: { 
     (user,error) in 
     return error === nil 
    }) 
} 

我得到的错误“布尔不可自由兑换作废”,这是有道理的。

所以,如果我改变线3阅读:

(user,error) -> Bool in 

我结束了错误“在呼吁参数选择缺少参数”

然而,这种方法不需要选择参数。

那么我哪里错了?如何根据登录时是否有错误返回一个布尔值?

+0

在一个侧面说明,此代码工作完全正常: VAR错误:NSError? PFUser.logInWithUsername(userName.text,密码:passwordField.text,错误:错误) 如果(错误==无){ 还真 }其他{ 返回假 } 不过控制台有这样的警告: 警告:正在主线程上执行长时间运行的操作。 – ArchonLight 2014-12-03 05:51:03

+1

你必须明白logInWithUsernameInBackground是一个* asynchronous *方法,并且你的authenticateUser方法在调用完成闭包之前返回*。 – 2014-12-03 06:15:13

回答

5

基于代码为你写的,如果你想返回布尔,你可以这样做:

func authenticateUser() -> Bool{ 
    PFUser.logInWithUsernameInBackground(userName.text, password: passwordField.text, block: { 
     (user,error) in 
     return error === nil 
    }) 

    return true // This is where the bool is returned 
} 

但是,你想要做的,根据你的代码是什么,就是:

func authenticateUser(completion:(Bool) ->()) { 
    PFUser.logInWithUsernameInBackground(userName.text, password: passwordField.text, block: { 
     (user,error) in 
     completion(error === nil) 
    }) 
} 

您可以通过下面的一个调用电话:

authenticateUser(){ 
    result in 
    if result { 
     println("Authenticated") 
    } else { 
     println("Not authenticated") 
    } 
} 

authenticateUser({ 
    result in 
    if result { 
     println("Authenticated") 
    } else { 
     println("Not authenticated") 
    } 
}) 

第一个是速记,在关闭之前有其他参数时更方便。

这意味着您正在取回您的布尔是否异步验证身份。

顺便说一句,你真的只需要做error == nil

+0

这正是我想要的。有一件事,我怎么称呼它?我通过了哪个参数? ... 如果self.authenticateUser(){//用于参数的#1,电话... 还缺少参数: 我知道这是哪里回报会去,但将永远是真的,是不是我希望非常感谢您使用更新后的代码对其进行更正... ===是为了使错误消失 – ArchonLight 2014-12-04 03:17:14

+0

我刚刚更新了答案,让代码调用它。 – 2014-12-04 09:22:10

+0

非常感谢! – ArchonLight 2014-12-04 14:08:59