Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Parse PFUser.currentUser返回nil-Swift_Ios_Swift_Login_Parse Platform - Fatal编程技术网

Ios Parse PFUser.currentUser返回nil-Swift

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

我正在使用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)
        }
    }
}
如果用户已登录,则会将其带到下面描述的表视图。如果他们没有登录,他们会被带到一个视图,在该视图中他们可以转到注册视图或登录视图

我的注册工作非常好,注册用户,然后将他们重定向到表视图。 以下是注册功能(它与登录功能位于单独的控制器中):

我的登录功能如下所示:

@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
}