Ios Parse PFUser.currentUser返回nil-Swift
我正在使用Parse登录我的用户。当我的应用打开时,我的LaunchVieWController确定用户是否已登录:Ios Parse PFUser.currentUser返回nil-Swift,ios,swift,login,parse-platform,Ios,Swift,Login,Parse Platform,我正在使用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(cu
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)
}
}
}
如果用户已登录,则会将其带到下面描述的表视图。如果他们没有登录,他们会被带到一个视图,在该视图中他们可以转到注册视图或登录视图
我的注册工作非常好,注册用户,然后将他们重定向到表视图。
以下是注册功能(它与登录功能位于单独的控制器中):
我的登录功能如下所示:
@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()
对象为nil
当用户在注册后被发送到表视图时,PFUser.currentUser()对象被设置并正常工作
我猜这是因为PFUser.logInWithUsernameInBackground
发生在后台,而我的查询试图在加载PFUser.currentUser()
对象之前获取该对象。我是否有办法解决这个问题?在表格视图中,加载表格数据需要PFUser.currentUser()
的值。我是否可以在调用函数之前(例如,不在后台线程中加载用户),以某种方式确保PFUser.currentUser()
被分配了当前用户对象
非常感谢您的帮助
编辑:我已经用我的一些代码更新了这篇文章,以帮助突出我可能缺少的任何错误。您可以尝试检查
PFUser.currentUser()!=nil
以确保在登录后立即设置。如果没有立即设置,您就知道存在更深层次的登录问题
另外,尝试删除segue调用周围的dispatch\u async(dispatch\u get\u main\u queue()){
wrapper
这是不必要的(logInWithUsernameInBackground已经返回到主线程)我有一种预感,它正在创建一个竞速条件,其中本地对象没有被首先设置,因为Parse无法进行任何调用后清理,因为您正使用主线程。我发现出现这个问题是因为segue
signintoavigation
是从登录按钮连接的,而不是从登录vi连接的ew控制器本身。这导致在执行登录函数之前执行segue,因此在加载表视图时,PFUser.currentUser()
对象尚未分配。我通过重新连接segue解决了这个问题。我这边出现了一个愚蠢的错误
感谢Ryan Kreager和Wain花时间帮助我解决这个问题!您测试过它是否在登录响应处理程序之前调用吗?我不完全确定如何测试它,但我在这里添加了一个断点:错误仍然存在(它不会在断点处停止,而是在表视图中抛出与以前相同的错误)。这似乎真的很奇怪,因为我认为必须先执行
SigningToNavigation
segue,然后才能执行该视图中的任何代码。除非有不同的方法,否则它会执行。在这一阶段,日志记录可能比断点更有效。我已经更新了我的帖子(希望如此)相关代码。当我注册用户时,PFUser.currenUser对象被设置好,一切正常。我无法理解为什么登录函数不起作用。你应该真正使用表单if let user=user{
,而不是if user!=nil{
以检查用户是否可用,但除此之外,我看不出任何错误。您是否已在登录响应中记录返回的用户和错误?感谢您的回答!如果我删除调度异步,则仍然会抛出错误(致命错误:在展开可选值时意外发现零)(dispatch_get_main_queue()){
。我更新了我的帖子,希望有更多的更新相关代码。当我注册用户时,PFUser.currenUser
对象被设置,一切正常。我无法理解为什么登录功能不能正常工作。我将测试它,看看是否能找到错误!更新我的答案-尝试检查PFUser.currentUser()!=nil
除了检查if user!=nil
以确保在登录后立即设置。发现问题。感谢您的帮助!Huzzah!很高兴您能解决此问题:)
override func queryForTable() -> PFQuery {
var query = PFQuery(className:"MyClass")
query.whereKey("userID", equalTo: PFUser.currentUser()!)
return query
}