【发布时间】:2015-07-20 16:57:27
【问题描述】:
我正在使用 Parse 登录我的用户。当我的应用打开时,我的 LaunchVieWController 会确定用户是否已经登录:
override func viewDidLoad() {
super.viewDidLoad()
//Make sure cached users don't have to log in every time they open the app
var currentUser = PFUser.currentUser()
println(currentUser)
if currentUser != nil {
dispatch_async(dispatch_get_main_queue()) {
self.performSegueWithIdentifier("alreadySignedIn", sender: self)
}
} else {
dispatch_async(dispatch_get_main_queue()) {
self.performSegueWithIdentifier("showSignUpIn", sender: self)
}
}
}
如果用户已经登录,他们将被带到下面描述的表格视图。如果他们没有登录,他们将被带到一个视图,在该视图中他们可以进入注册视图或登录视图。
我的注册工作非常好,注册用户,然后将他们重定向到表格视图。 这是注册功能(它与登录功能位于单独的控制器中):
func processSignUp() {
var userEmailAddress = emailAddress.text
var userPassword = password.text
// Ensure username is lowercase
userEmailAddress = userEmailAddress.lowercaseString
// Add email address validation
// Start activity indicator
activityIndicator.hidden = false
activityIndicator.startAnimating()
// Create the user
var user = PFUser()
user.username = userEmailAddress
user.password = userPassword
user.email = userEmailAddress
user.signUpInBackgroundWithBlock {
(succeeded: Bool, error: NSError?) -> Void in
if error == nil {
dispatch_async(dispatch_get_main_queue()) {
self.performSegueWithIdentifier("signInToNavigation", sender: self)
}
} else {
self.activityIndicator.stopAnimating()
if let message: AnyObject = error!.userInfo!["error"] {
self.message.text = "\(message)"
}
}
}
}
我的登录功能如下:
@IBAction func signIn(sender: AnyObject) {
var userEmailAddress = emailAddress.text
userEmailAddress = userEmailAddress.lowercaseString
var userPassword = password.text
PFUser.logInWithUsernameInBackground(userEmailAddress, password:userPassword) {
(user: PFUser?, error: NSError?) -> Void in
if user != nil {
dispatch_async(dispatch_get_main_queue()) {
self.performSegueWithIdentifier("signInToNavigation", sender: self)
}
} else {
if let message: AnyObject = error!.userInfo!["error"] {
self.message.text = "\(message)"
}
}
}
}
用户登录后,他们会被发送到表格视图。在该表视图中,我试图在以下函数中访问当前用户对象,因为我想根据用户是谁加载不同的数据:
override func queryForTable() -> PFQuery {
var query = PFQuery(className:"MyClass")
query.whereKey("userID", equalTo: PFUser.currentUser()!)
return query
}
当我尝试使用用户登录时,我收到以下错误:“致命错误:在展开可选值时意外发现 nil”。 PFUser.currentUser() 对象似乎为零。
当用户在注册后被发送到表格视图时,PFUser.currentUser() 对象被设置并且可以正常工作。
我的猜测是,这是因为 PFUser.logInWithUsernameInBackground 正在后台发生,并且我的查询试图在加载之前获取 PFUser.currentUser() 对象。无论如何我可以解决这个问题吗?在表视图中,需要 PFUser.currentUser() 的值来加载表数据。我能否以某种方式确保在调用函数之前为PFUser.currentUser() 分配了当前用户对象(例如,通过不在后台线程中加载用户)?
非常感谢所有帮助!
编辑:我已经用我的更多代码更新了这篇文章,以帮助突出我可能遗漏的任何错误。
【问题讨论】:
-
你是否测试过它是否在登录响应处理程序之前被调用?
-
我不完全确定如何对此进行测试,但我在这里添加了一个断点:i.imgur.com/cYZLtNj.png 并且错误仍然存在(它不会在断点处停止,但会抛出相同的表视图中的错误)。这看起来很奇怪,因为我认为
signInToNavigationsegue 必须在该视图中的任何代码执行之前执行。 -
它会,除非有不同的方法来实现它。在这个阶段,日志记录可能比断点更好
-
我已经用更多(希望是)相关代码更新了我的帖子。当我注册用户时,PFUser.currenUser 对象被设置并且一切正常。无法理解为什么这不适用于登录功能。
-
您真的应该使用
if let user = user {而不是if user != nil {的形式来检查用户是否可用,但除此之外我看不出有什么问题。您是否在登录响应中记录了返回的用户和错误?
标签: ios swift login parse-platform