2017-07-24 22 views
1

我有一个连接到Firebase的应用程序,您可以使用Google和Facebook登录。该应用程序具有用户登录时加载的主屏幕。如果用户之前已登录,我不想显示登录屏幕。所以我用这个代码在主屏幕,以检查用户是否登录,主页屏幕是在应用程序Swift - 这段代码是否错误,或者我应该使用UserDefaults?

override func viewDidAppear(_ animated: Bool) { 
    if Auth.auth().currentUser != nil{ 
     // user is signed in 
    }else{ 
     // No user is signed in. 
     performSegue(withIdentifier: "login", sender: nil) 
    } 
} 

初始视图控制器此代码的工作非常出色。我知道,我也可以使用UserDefaults,但这似乎是一种更简单的方法。它是错的还是应该使用UserDefaults?

但唯一的问题是,为了快速显示主屏幕,然后在登录屏幕上执行segue,我猜这是因为它在viewdidApepar方法中,所以代码在视图控制器出现。你知道解决方案吗?

+0

我相信,Firebase使用此API下方的UserDefaults或CoreData。我用同样的方式,从来没有任何问题。 –

+0

是的,但唯一的问题是快速显示主屏幕,然后在登录屏幕上执行segue,我猜这是因为它在viewdidApepar方法中,所以代码在viewcontroller出现后执行。你知道解决方案吗? –

+1

使用'viewWillAppear'可能会工作 –

回答

1

这就是我亲自做的,在AppDelegate中做了didFinishLaunchingWithOptions。

if UserManager.sharedManager.currentUser != nil { 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main) 
     let viewController = storyboard.instantiateInitialViewController() 
     appDelegate.window?.rootViewController = viewController 
    } else { 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     let storyboard = UIStoryboard(name: "Login", bundle: Bundle.main) 
     let viewController = storyboard.instantiateInitialViewController() 
     appDelegate.window?.rootViewController = viewController 
    } 

当然,我有,如果用户在或没有登录它处理一个的UserManager。(的UserManager:NSObject的)

var currentUser: User? { 
    return User.unarchiveStoredUser() 
} 

用户存储有解码器被分为UserDefautls然后未归档到验证用户是否是否已登录(用户:NSObject)

func archiveUser() { 
    let data = NSKeyedArchiver.archivedData(withRootObject: self) 
    UserDefaults.standard.set(data, forKey: "userIdentifier") 
    UserDefaults.standard.synchronize() 
} 

class func unarchiveStoredUser() -> User? { 
    if let data = UserDefaults.standard.object(forKey: "userIdentifier") as? Data { 
     let user = NSKeyedUnarchiver.unarchiveObject(with: data) as! User 
     return user 
    } 
    return nil 
} 

希望它可以帮助你。

+0

我应该在哪里放置关于currentUser的第二个代码段? –

+0

另外,你的第三个代码段是在一个名为UserManager的类中? –

+0

添加了他们所属的文件作为编辑。 – Velix007

相关问题