Parse - 如何在加载视图之前检查登录用户?

Parse - How do I check for a logged in user before the view loads?

我试图在决定是否显示 login/signup 视图控制器或已登录的视图控制器之前验证是否有用户。我 运行 遇到的问题是,要检查用户是否存在,我必须等待 viewDidAppear,因为出于某种原因,如果我 运行 签入 viewDidLoad.

我正在为我的用户系统使用 Parse,但我不确定这是否是问题的一部分。下面的代码工作正常,除了 ViewController 的视图在执行 if(PFUser.currentUser() != nil) 行之前的一瞬间被加载。

我希望能够 运行 用户签入 viewDidLoad 因此视图不必实际出现,但用户总是 return nil如果我这样做。

我试过在 login/signup 屏幕之前添加一个空白视图控制器,但这只会加载一个白色屏幕一秒钟。我尝试在情节提要启动屏幕上这样做,但这是不允许的(我相信有充分的理由),我可以创建一个视图,它是启动屏幕的副本,并从那里 运行 它,但这似乎有点像黑客一样。

这样做的正确方法是什么?我认为这是大多数应用程序中常见的事情,我只是不知道在哪里执行 if 语句。

import UIKit
import Parse

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        if (PFUser.currentUser() != nil) {
            let vc = self.storyboard!.instantiateViewControllerWithIdentifier("summaryView")
            self.presentViewController(vc, animated: true, completion: nil)
        }
    }
}

我在 swift 中不知道,但在 objective-c 中,它就像将此放入 viewDidLoad 作为您的目标网页一样简单:

PFUser *user = [PFUser currentUser];
if( user )
{
    //user's session token is still valid, navigate to appropriate page
}
else
{
    //display landing page to sign up / log in
}

尝试将其放入 init 中,如下所示:

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        //code
}

这是 ViewController 生命周期中应该调用的第一件事

或者,尝试在 viewWillAppear 中使用 int:

override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        //code
}

您可以将您的代码放入 application(_:, didFinishLaunchingWithOptions:)

if let user = PFUser.currentUser() {
    // Code to execute if user is logged in
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let viewController = storyboard.instantiateViewControllerWithIdentifier("VCIdentifier") 

    self.window?.rootViewController = viewController
    self.window?.makeKeyAndVisible()

} else {
    // Default screen you set in info plist.
}